public API for custom java source position highlighting
authorNikolay Tropin <Nikolay.Tropin@jetbrains.com>
Wed, 24 Jun 2015 10:44:20 +0000 (13:44 +0300)
committerEgor.Ushakov <egor.ushakov@jetbrains.com>
Wed, 24 Jun 2015 10:44:20 +0000 (13:44 +0300)
java/debugger/impl/src/com/intellij/debugger/engine/JavaSourcePositionHighlighter.java [new file with mode: 0644]
java/debugger/impl/src/com/intellij/debugger/engine/PositionManagerImpl.java
java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java
java/debugger/openapi/src/com/intellij/debugger/engine/SourcePositionHighlighter.java [new file with mode: 0644]
resources/src/META-INF/IdeaPlugin.xml

diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaSourcePositionHighlighter.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaSourcePositionHighlighter.java
new file mode 100644 (file)
index 0000000..7a8a4d7
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2000-2015 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.debugger.engine;
+
+import com.intellij.debugger.SourcePosition;
+import com.intellij.debugger.impl.DebuggerUtilsEx;
+import com.intellij.openapi.util.TextRange;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiLambdaExpression;
+
+/**
+ * @author Nikolay.Tropin
+ */
+public class JavaSourcePositionHighlighter extends SourcePositionHighlighter {
+  @Override
+  public TextRange getHighlightRange(SourcePosition sourcePosition) {
+    PsiElement method = DebuggerUtilsEx.getContainingMethod(sourcePosition);
+    if (method instanceof PsiLambdaExpression) {
+      return method.getTextRange();
+    }
+    return null;
+  }
+}
index 75665f4025de1b1f212cf3a6bc9a70f3b954808c..77b1c44f093da7da2b94bbe0906f79f93796742f 100644 (file)
@@ -28,7 +28,10 @@ import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.editor.Document;
 import com.intellij.openapi.project.Project;
-import com.intellij.openapi.util.*;
+import com.intellij.openapi.util.Comparing;
+import com.intellij.openapi.util.Computable;
+import com.intellij.openapi.util.NullableComputable;
+import com.intellij.openapi.util.Ref;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.*;
@@ -38,7 +41,6 @@ import com.intellij.psi.util.PsiTreeUtil;
 import com.intellij.util.Function;
 import com.intellij.util.containers.ContainerUtil;
 import com.intellij.util.containers.EmptyIterable;
-import com.intellij.xdebugger.impl.ui.ExecutionPointHighlighter;
 import com.sun.jdi.AbsentInformationException;
 import com.sun.jdi.Location;
 import com.sun.jdi.Method;
@@ -200,7 +202,7 @@ public class PositionManagerImpl implements PositionManager, MultiRequestPositio
     return new JavaSourcePosition(sourcePosition, location.declaringType(), method, lambdaOrdinal);
   }
 
-  private static class JavaSourcePosition extends RemappedSourcePosition implements ExecutionPointHighlighter.HighlighterProvider {
+  private static class JavaSourcePosition extends RemappedSourcePosition {
     private final String myExpectedClassName;
     private final String myExpectedMethodName;
     private final int myLambdaOrdinal;
@@ -275,16 +277,6 @@ public class PositionManagerImpl implements PositionManager, MultiRequestPositio
         }
       });
     }
-
-    @Nullable
-    @Override
-    public TextRange getHighlightRange() {
-      PsiElement method = DebuggerUtilsEx.getContainingMethod(this);
-      if (method instanceof PsiLambdaExpression) {
-        return method.getTextRange();
-      }
-      return null;
-    }
   }
 
   private static Iterable<PsiElement> getLineElements(final PsiFile file, int lineNumber) {
index 74e50d2920bdcb95b3f54f5c2aea72539c91fd6b..b776bcad734972e226b134794cec8298ecfe5d47 100644 (file)
@@ -22,10 +22,7 @@ package com.intellij.debugger.impl;
 
 import com.intellij.debugger.DebuggerBundle;
 import com.intellij.debugger.SourcePosition;
-import com.intellij.debugger.engine.DebuggerManagerThreadImpl;
-import com.intellij.debugger.engine.DebuggerUtils;
-import com.intellij.debugger.engine.LambdaMethodFilter;
-import com.intellij.debugger.engine.SuspendContextImpl;
+import com.intellij.debugger.engine.*;
 import com.intellij.debugger.engine.evaluation.*;
 import com.intellij.debugger.engine.evaluation.expression.EvaluatorBuilder;
 import com.intellij.debugger.engine.requests.RequestManagerImpl;
@@ -752,10 +749,7 @@ public abstract class DebuggerUtilsEx extends DebuggerUtils {
     @Nullable
     @Override
     public TextRange getHighlightRange() {
-      if (mySourcePosition instanceof ExecutionPointHighlighter.HighlighterProvider) {
-        return ((ExecutionPointHighlighter.HighlighterProvider)mySourcePosition).getHighlightRange();
-      }
-      return null;
+      return SourcePositionHighlighter.getHighlightRangeFor(mySourcePosition);
     }
   }
 
diff --git a/java/debugger/openapi/src/com/intellij/debugger/engine/SourcePositionHighlighter.java b/java/debugger/openapi/src/com/intellij/debugger/engine/SourcePositionHighlighter.java
new file mode 100644 (file)
index 0000000..f8349e8
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2000-2015 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.debugger.engine;
+
+import com.intellij.debugger.SourcePosition;
+import com.intellij.openapi.extensions.ExtensionPointName;
+import com.intellij.openapi.util.TextRange;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author Nikolay.Tropin
+ */
+public abstract class SourcePositionHighlighter {
+  public static final ExtensionPointName<SourcePositionHighlighter> EP_NAME = ExtensionPointName.create("com.intellij.debugger.sourcePositionHighlighter");
+
+  abstract TextRange getHighlightRange(SourcePosition sourcePosition);
+
+  @Nullable
+  public static TextRange getHighlightRangeFor(SourcePosition sourcePosition) {
+    for (SourcePositionHighlighter provider: EP_NAME.getExtensions()) {
+      TextRange range = provider.getHighlightRange(sourcePosition);
+      if (range != null) {
+        return range;
+      }
+    }
+    return null;
+  }
+}
index b3fb1a66c5e4f4e239959e27f07b8e6c1c36561e..e4cb9111458d6a3015b60a5938db54317ce3e109 100644 (file)
     <extensionPoint name="debugger.extraSteppingFilter"
                     interface="com.intellij.debugger.engine.ExtraSteppingFilter"/>
 
+    <extensionPoint name="debugger.sourcePositionHighlighter"
+                    interface="com.intellij.debugger.engine.SourcePositionHighlighter"/>
+
     <extensionPoint name="allOverridingMethodsSearch" interface="com.intellij.util.QueryExecutor"/>
     <extensionPoint name="annotatedElementsSearch" interface="com.intellij.util.QueryExecutor"/>
     <extensionPoint name="annotatedPackagesSearch" interface="com.intellij.util.QueryExecutor"/>
     <debugger.simplePropertyGetterProvider implementation="com.intellij.debugger.engine.JavaSimpleGetterProvider"/>
     <debugger.syntheticProvider implementation="com.intellij.debugger.engine.DefaultSyntheticProvider"/>
     <debugger.sourcePositionProvider implementation="com.intellij.debugger.engine.DefaultSourcePositionProvider" order="last"/>
+    <debugger.sourcePositionHighlighter implementation="com.intellij.debugger.engine.JavaSourcePositionHighlighter"/>
 
     <debugger.nodeRenderer implementation="com.intellij.debugger.ui.tree.render.ColorObjectRenderer"/>
     <debugger.nodeRenderer implementation="com.intellij.debugger.ui.tree.render.ImageObjectRenderer"/>