mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
hotswap: allow class reload task cancelling as long as no classes are actually reloaded
This commit is contained in:
@@ -155,13 +155,14 @@ public class HotSwapManager extends AbstractProjectComponent {
|
||||
}
|
||||
|
||||
private void reloadClasses(DebuggerSession session, Map<String, HotSwapFile> 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<DebuggerSession, Map<String, HotSwapFile>> findModifiedClasses(List<DebuggerSession> sessions, Map<String, List<String>> generatedPaths) {
|
||||
|
||||
@@ -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<String, HotSwapFile> 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);
|
||||
}
|
||||
|
||||
|
||||
@@ -269,8 +269,7 @@ public class HotSwapUIImpl extends HotSwapUI implements ProjectComponent {
|
||||
return result.get();
|
||||
}
|
||||
|
||||
private static void reloadModifiedClasses(final Map<DebuggerSession, Map<String, HotSwapFile>> modifiedClasses,
|
||||
final HotSwapProgressImpl progress) {
|
||||
private static void reloadModifiedClasses(final Map<DebuggerSession, Map<String, HotSwapFile>> modifiedClasses, final HotSwapProgressImpl progress) {
|
||||
ProgressManager.getInstance().runProcess(new Runnable() {
|
||||
public void run() {
|
||||
HotSwapManager.reloadModifiedClasses(modifiedClasses, progress);
|
||||
|
||||
Reference in New Issue
Block a user