diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java b/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java index bf0569b4755b..7347b430cacd 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java @@ -155,13 +155,14 @@ public class HotSwapManager extends AbstractProjectComponent { } private void reloadClasses(DebuggerSession session, Map classesToReload, HotSwapProgress progress) { - if (progress.isCancelled()) { - session.setModifiedClassesScanRequired(true); - return; - } final long newSwapTime = System.currentTimeMillis(); new ReloadClassesWorker(session, progress).reloadClasses(classesToReload); - setTimeStamp(session, newSwapTime); + if (progress.isCancelled()) { + session.setModifiedClassesScanRequired(true); + } + else { + setTimeStamp(session, newSwapTime); + } } public static Map> findModifiedClasses(List sessions, Map> generatedPaths) { diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/ReloadClassesWorker.java b/java/debugger/impl/src/com/intellij/debugger/impl/ReloadClassesWorker.java index 9a43bfbcc881..2898e3f10dd9 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/ReloadClassesWorker.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/ReloadClassesWorker.java @@ -114,32 +114,44 @@ class ReloadClassesWorker { try { RedefineProcessor redefineProcessor = new RedefineProcessor(virtualMachineProxy); - int processedClassesCount = 0; - for (final String qualifiedName : modifiedClasses.keySet()) { - processedClassesCount++; + int processedEntriesCount = 0; + for (final Map.Entry entry : modifiedClasses.entrySet()) { + if (redefineProcessor.getProcessedClassesCount() == 0 && myProgress.isCancelled()) { + // once at least one class has been actually reloaded, do not interrupt the whole process + break; + } + processedEntriesCount++; + final String qualifiedName = entry.getKey(); if (qualifiedName != null) { myProgress.setText(qualifiedName); - myProgress.setFraction(processedClassesCount / (double)modifiedClasses.size()); + myProgress.setFraction(processedEntriesCount / (double)modifiedClasses.size()); } - final HotSwapFile fileDescr = modifiedClasses.get(qualifiedName); try { - redefineProcessor.processClass(qualifiedName, fileDescr.file); + redefineProcessor.processClass(qualifiedName, entry.getValue().file); } catch (IOException e) { reportProblem(qualifiedName, e); } } + + if (redefineProcessor.getProcessedClassesCount() == 0 && myProgress.isCancelled()) { + // once at least one class has been actually reloaded, do not interrupt the whole process + return; + } + redefineProcessor.processPending(); myProgress.setFraction(1); final int partiallyRedefinedClassesCount = redefineProcessor.getPartiallyRedefinedClassesCount(); if (partiallyRedefinedClassesCount == 0) { - myProgress.addMessage(myDebuggerSession, MessageCategory.INFORMATION, - DebuggerBundle.message("status.classes.reloaded", redefineProcessor.getProcessedClassesCount())); + myProgress.addMessage( + myDebuggerSession, MessageCategory.INFORMATION, DebuggerBundle.message("status.classes.reloaded", redefineProcessor.getProcessedClassesCount()) + ); } else { - final String message = DebuggerBundle.message("status.classes.not.all.versions.reloaded", partiallyRedefinedClassesCount, - redefineProcessor.getProcessedClassesCount()); + final String message = DebuggerBundle.message( + "status.classes.not.all.versions.reloaded", partiallyRedefinedClassesCount, redefineProcessor.getProcessedClassesCount() + ); myProgress.addMessage(myDebuggerSession, MessageCategory.WARNING, message); } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/HotSwapUIImpl.java b/java/debugger/impl/src/com/intellij/debugger/ui/HotSwapUIImpl.java index 9c61c8c73fe5..19f94cbe8658 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/HotSwapUIImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/HotSwapUIImpl.java @@ -269,8 +269,7 @@ public class HotSwapUIImpl extends HotSwapUI implements ProjectComponent { return result.get(); } - private static void reloadModifiedClasses(final Map> modifiedClasses, - final HotSwapProgressImpl progress) { + private static void reloadModifiedClasses(final Map> modifiedClasses, final HotSwapProgressImpl progress) { ProgressManager.getInstance().runProcess(new Runnable() { public void run() { HotSwapManager.reloadModifiedClasses(modifiedClasses, progress);