Bug 507546 - Skip debug value codemining provider without debug launch
No need to crawl files if there is no debug launch running.
Change-Id: I6da47bbe568c88c47a4e61ce184140d945301581
Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.debug/+/190835
Tested-by: Andrey Loskutov <loskutov@gmx.de>
Reviewed-by: Andrey Loskutov <loskutov@gmx.de>
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/codemining/DebugValueCodeMiningProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/codemining/DebugValueCodeMiningProvider.java
index 96d6d7c..5ddcd2a 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/codemining/DebugValueCodeMiningProvider.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/codemining/DebugValueCodeMiningProvider.java
@@ -14,12 +14,16 @@
import java.util.LinkedHashMap;
import java.util.List;
import java.util.concurrent.CompletableFuture;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
import org.eclipse.core.runtime.Adapters;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IDebugEventSetListener;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.core.model.IVariable;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.ui.IDebugUIConstants;
@@ -34,7 +38,6 @@
public class DebugValueCodeMiningProvider extends AbstractCodeMiningProvider {
- private volatile boolean alreadyListening;
private volatile IDebugEventSetListener listener;
@Override
@@ -44,10 +47,17 @@
return CompletableFuture.completedFuture(List.of());
}
final IDocument document = viewer.getDocument();
- if (viewer instanceof ISourceViewerExtension5 && !alreadyListening) {
- alreadyListening = true;
- listener = e -> ((ISourceViewerExtension5) viewer).updateCodeMinings();
- DebugPlugin.getDefault().addDebugEventListener(listener);
+ if (viewer instanceof ISourceViewerExtension5 && listener == null) {
+ synchronized (this) {
+ if (listener == null) {
+ IDebugEventSetListener debugListener = e -> ((ISourceViewerExtension5) viewer).updateCodeMinings();
+ DebugPlugin.getDefault().addDebugEventListener(debugListener);
+ listener = debugListener;
+ }
+ }
+ }
+ if (!hasDebugRunning()) {
+ return CompletableFuture.completedFuture(List.of());
}
return CompletableFuture.supplyAsync(() -> {
List<DebugValueCodeMining> res = new ArrayList<>();
@@ -78,14 +88,22 @@
});
}
+ private boolean hasDebugRunning() {
+ return Stream.of(DebugPlugin.getDefault().getLaunchManager().getLaunches()) //
+ .filter(Predicate.not(ILaunch::isTerminated)) //
+ .anyMatch(launch -> ILaunchManager.DEBUG_MODE.equals(launch.getLaunchMode()));
+ }
+
private boolean isEnabled() {
return DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugUIConstants.PREF_SHOW_VARIABLES_INLINE);
}
@Override
public void dispose() {
- if (listener != null) {
- DebugPlugin.getDefault().removeDebugEventListener(listener);
+ IDebugEventSetListener debugListener = listener;
+ if (debugListener != null) {
+ DebugPlugin.getDefault().removeDebugEventListener(debugListener);
+ listener = null;
}
}
}