IDEA-131134 Support multiple breakpoints within on single line - support custom line...
authorEgor.Ushakov <egor.ushakov@jetbrains.com>
Tue, 16 Jun 2015 13:05:08 +0000 (16:05 +0300)
committerEgor.Ushakov <egor.ushakov@jetbrains.com>
Tue, 16 Jun 2015 15:01:58 +0000 (18:01 +0300)
java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/JavaLineBreakpointType.java
platform/core-impl/src/com/intellij/util/DocumentUtil.java
platform/xdebugger-api/src/com/intellij/xdebugger/breakpoints/XLineBreakpointType.java
platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java
platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XLineBreakpointImpl.java

index ff1b10d1d8d684d1c55a2368f67142b527af8ac1..0eea684d792c7398d9249114b26ad4d35bd6bc9c 100644 (file)
@@ -37,7 +37,6 @@ import com.intellij.xdebugger.impl.breakpoints.XLineBreakpointVariant;
 import com.intellij.xdebugger.impl.breakpoints.XLineBreakpointVariantsProvider;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import org.jetbrains.java.debugger.breakpoints.properties.JavaBreakpointProperties;
 import org.jetbrains.java.debugger.breakpoints.properties.JavaLineBreakpointProperties;
 
 import javax.swing.*;
@@ -48,7 +47,7 @@ import java.util.List;
  * Base class for java line-connected exceptions (line, method, field)
  * @author egor
  */
-public class JavaLineBreakpointType extends JavaLineBreakpointTypeBase<JavaBreakpointProperties>
+public class JavaLineBreakpointType extends JavaLineBreakpointTypeBase<JavaLineBreakpointProperties>
   implements JavaBreakpointType, XLineBreakpointVariantsProvider<JavaLineBreakpointType.JavaBreakpointVariant> {
   public JavaLineBreakpointType() {
     super("java-line", DebuggerBundle.message("line.breakpoints.tab.title"));
@@ -65,7 +64,7 @@ public class JavaLineBreakpointType extends JavaLineBreakpointTypeBase<JavaBreak
   }
 
   @Override
-  public List<XBreakpointGroupingRule<XLineBreakpoint<JavaBreakpointProperties>, ?>> getGroupingRules() {
+  public List<XBreakpointGroupingRule<XLineBreakpoint<JavaLineBreakpointProperties>, ?>> getGroupingRules() {
     return XDebuggerUtil.getInstance().getGroupingByFileRuleAsList();
   }
 
@@ -191,4 +190,21 @@ public class JavaLineBreakpointType extends JavaLineBreakpointTypeBase<JavaBreak
       return properties;
     }
   }
+
+  @Nullable
+  @Override
+  public TextRange getHighlightRange(JavaLineBreakpointProperties properties, Document document, Project project) {
+    Integer offset = properties.getOffset();
+    if (offset != null) {
+      PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(document);
+      if (file != null) {
+        PsiElement elem = file.findElementAt(offset);
+        NavigatablePsiElement method = PsiTreeUtil.getParentOfType(elem, PsiMethod.class, PsiLambdaExpression.class);
+        if (method != null) {
+          return method.getTextRange();
+        }
+      }
+    }
+    return null;
+  }
 }
index d90c4b2803734b22382b55e2a759951438d809e0..eb2d3ebf15695490f2efba769662172e886488ca 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * 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.
@@ -19,6 +19,7 @@ import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.command.CommandProcessor;
 import com.intellij.openapi.editor.Document;
 import com.intellij.openapi.editor.ex.DocumentEx;
+import com.intellij.openapi.util.TextRange;
 import org.jetbrains.annotations.NotNull;
 
 /**
@@ -94,4 +95,9 @@ public final class DocumentUtil {
     int lineNumber = document.getLineNumber(offset);
     return document.getLineStartOffset(lineNumber);
   }
+
+  @NotNull
+  public static TextRange getLineTextRange(@NotNull Document document, int line) {
+    return TextRange.create(document.getLineStartOffset(line), document.getLineEndOffset(line));
+  }
 }
index d9666efd192742ab41d17637b19c33055f708e37..8bfab167945d61b17be3f616301d2dadc25f5832 100644 (file)
@@ -18,7 +18,9 @@ package com.intellij.xdebugger.breakpoints;
 
 import com.intellij.icons.AllIcons;
 import com.intellij.openapi.actionSystem.AnAction;
+import com.intellij.openapi.editor.Document;
 import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.TextRange;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.xdebugger.XDebugSession;
 import com.intellij.xdebugger.XDebuggerBundle;
@@ -116,4 +118,12 @@ public abstract class XLineBreakpointType<P extends XBreakpointProperties> exten
   public boolean canBeHitInOtherPlaces() {
     return false;
   }
+
+  /**
+   * @return range to highlight on the line, null to highlight the whole line
+   */
+  @Nullable
+  public TextRange getHighlightRange(P properties, Document document, Project project) {
+    return null;
+  }
 }
index 4c1e8db900c63f93a961bd3fe8f7453b43bdb67f..d7ee25675e268b4ab2930937ab6c5c54b52fb777 100644 (file)
@@ -46,6 +46,7 @@ import com.intellij.psi.*;
 import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
 import com.intellij.psi.util.PsiTreeUtil;
 import com.intellij.ui.awt.RelativePoint;
+import com.intellij.util.DocumentUtil;
 import com.intellij.util.Processor;
 import com.intellij.util.SmartList;
 import com.intellij.xdebugger.*;
@@ -169,8 +170,7 @@ public class XDebuggerUtilImpl extends XDebuggerUtil {
                       Object value = ((JList)e.getSource()).getSelectedValue();
                       if (value instanceof XLineBreakpointVariant) {
                         TextRange range = ((XLineBreakpointVariant)value).getHighlightRange();
-                        TextRange lineRange =
-                          TextRange.create(editor.getDocument().getLineStartOffset(line), editor.getDocument().getLineEndOffset(line));
+                        TextRange lineRange = DocumentUtil.getLineTextRange(editor.getDocument(), line);
                         if (range != null) {
                           range = range.intersection(lineRange);
                         }
index 0d2fcb000d22972c364024ec78f7ac103d07b1b2..e86404b887faf2dd7ed3a9bc2797f86028a89cd0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * 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.
@@ -25,12 +25,10 @@ import com.intellij.openapi.editor.colors.EditorColorsScheme;
 import com.intellij.openapi.editor.ex.MarkupModelEx;
 import com.intellij.openapi.editor.ex.RangeHighlighterEx;
 import com.intellij.openapi.editor.impl.DocumentMarkupModel;
-import com.intellij.openapi.editor.markup.GutterDraggableObject;
-import com.intellij.openapi.editor.markup.MarkupEditorFilterFactory;
-import com.intellij.openapi.editor.markup.RangeHighlighter;
-import com.intellij.openapi.editor.markup.TextAttributes;
+import com.intellij.openapi.editor.markup.*;
 import com.intellij.openapi.fileEditor.FileDocumentManager;
 import com.intellij.openapi.util.Comparing;
+import com.intellij.openapi.util.TextRange;
 import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.vfs.LocalFileSystem;
 import com.intellij.openapi.vfs.VfsUtilCore;
@@ -56,8 +54,9 @@ import java.util.List;
 /**
  * @author nik
  */
-public class XLineBreakpointImpl<P extends XBreakpointProperties> extends XBreakpointBase<XLineBreakpoint<P>, P, LineBreakpointState<P>> implements XLineBreakpoint<P> {
-  @Nullable private RangeHighlighterEx myHighlighter;
+public class XLineBreakpointImpl<P extends XBreakpointProperties> extends XBreakpointBase<XLineBreakpoint<P>, P, LineBreakpointState<P>>
+  implements XLineBreakpoint<P> {
+  @Nullable private RangeHighlighter myHighlighter;
   private final XLineBreakpointType<P> myType;
   private XSourcePosition mySourcePosition;
   private boolean myDisposed;
@@ -89,7 +88,7 @@ public class XLineBreakpointImpl<P extends XBreakpointProperties> extends XBreak
     EditorColorsScheme scheme = EditorColorsManager.getInstance().getGlobalScheme();
     TextAttributes attributes = scheme.getAttributes(DebuggerColors.BREAKPOINT_ATTRIBUTES);
 
-    RangeHighlighterEx highlighter = myHighlighter;
+    RangeHighlighter highlighter = myHighlighter;
     if (highlighter != null &&
         (!highlighter.isValid()
          || !DocumentUtil.isValidOffset(highlighter.getStartOffset(), document)
@@ -104,7 +103,18 @@ public class XLineBreakpointImpl<P extends XBreakpointProperties> extends XBreak
     MarkupModelEx markupModel;
     if (highlighter == null) {
       markupModel = (MarkupModelEx)DocumentMarkupModel.forDocument(document, getProject(), true);
-      highlighter = markupModel.addPersistentLineHighlighter(getLine(), DebuggerColors.BREAKPOINT_HIGHLIGHTER_LAYER, attributes);
+      TextRange range = myType.getHighlightRange(getProperties(), document, getProject());
+      if (range != null && !range.isEmpty()) {
+        range = range.intersection(DocumentUtil.getLineTextRange(document, getLine()));
+        if (range != null && !range.isEmpty()) {
+          highlighter = markupModel.addRangeHighlighter(range.getStartOffset(), range.getEndOffset(),
+                                                        DebuggerColors.BREAKPOINT_HIGHLIGHTER_LAYER, attributes,
+                                                        HighlighterTargetArea.EXACT_RANGE);
+        }
+      }
+      if (highlighter == null) {
+        highlighter = markupModel.addPersistentLineHighlighter(getLine(), DebuggerColors.BREAKPOINT_HIGHLIGHTER_LAYER, attributes);
+      }
       if (highlighter == null) {
         return;
       }
@@ -124,7 +134,7 @@ public class XLineBreakpointImpl<P extends XBreakpointProperties> extends XBreak
       markupModel = (MarkupModelEx)DocumentMarkupModel.forDocument(document, getProject(), false);
       if (markupModel != null) {
         // renderersChanged false - we don't change gutter size
-        markupModel.fireAttributesChanged(highlighter, false);
+        markupModel.fireAttributesChanged((RangeHighlighterEx)highlighter, false);
       }
     }
   }
@@ -230,7 +240,9 @@ public class XLineBreakpointImpl<P extends XBreakpointProperties> extends XBreak
   }
 
   private boolean canMoveTo(int line, VirtualFile file) {
-    return file != null && myType.canPutAt(file, line, getProject()) && getBreakpointManager().findBreakpointAtLine(myType, file, line) == null;
+    return file != null &&
+           myType.canPutAt(file, line, getProject()) &&
+           getBreakpointManager().findBreakpointAtLine(myType, file, line) == null;
   }
 
   public void updatePosition() {