Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMickael Istria2022-02-14 21:00:48 +0000
committerMickael Istria2022-02-18 15:49:25 +0000
commitd2b269147d32d23fd862634be8fff8bc65ea23a3 (patch)
tree6bea0280c02feaec950165e3ae3d774327bfb556
parent5dafae846e9cba2e76b26ee46cd5431f59d7cac3 (diff)
downloadeclipse.platform.text-d2b269147d32d23fd862634be8fff8bc65ea23a3.tar.gz
eclipse.platform.text-d2b269147d32d23fd862634be8fff8bc65ea23a3.tar.xz
eclipse.platform.text-d2b269147d32d23fd862634be8fff8bc65ea23a3.zip
Bug 540448 - Fix end-of-line code minings for CRLF
Also-By: Thomas Wolf <thomas.wolf@paranor.ch> Change-Id: I8371007a2b90c9b63c06daad8d868d381fea3bee Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.text/+/190801 Tested-by: Mickael Istria <mistria@redhat.com> Reviewed-by: Mickael Istria <mistria@redhat.com> Reviewed-by: Thomas Wolf <thomas.wolf@paranor.ch>
-rw-r--r--org.eclipse.jface.text.examples/src/org/eclipse/jface/text/examples/codemining/CodeMiningDemo.java10
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/codemining/LineEndCodeMining.java8
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/source/inlined/InlinedAnnotationDrawingStrategy.java4
-rw-r--r--org.eclipse.jface.text/src/org/eclipse/jface/text/source/inlined/LineContentAnnotation.java10
4 files changed, 24 insertions, 8 deletions
diff --git a/org.eclipse.jface.text.examples/src/org/eclipse/jface/text/examples/codemining/CodeMiningDemo.java b/org.eclipse.jface.text.examples/src/org/eclipse/jface/text/examples/codemining/CodeMiningDemo.java
index ef748918de0..20236a633a9 100644
--- a/org.eclipse.jface.text.examples/src/org/eclipse/jface/text/examples/codemining/CodeMiningDemo.java
+++ b/org.eclipse.jface.text.examples/src/org/eclipse/jface/text/examples/codemining/CodeMiningDemo.java
@@ -53,7 +53,15 @@ public class CodeMiningDemo {
+ "// Empty lines show a header annotating they're empty.\n"
+ "// The word `echo` is echoed.\n"
+ "// Lines containing `end` get an annotation at their end\n\n"
- + "class A\n" + "new A\n" + "new A\n\n" + "class 5\n" + "new 5\n" + "new 5\n" + "new 5"),
+ + "class A\n" //
+ + "new A\n" //
+ + "new A\n\n" //
+ + "code mining at end here\n"
+ + "code mining at end here with CRLF\r\n"
+ + "class 5\n" //
+ + "new 5\n" //
+ + "new 5\n" //
+ + "new 5\n"),
new AnnotationModel());
// Add AnnotationPainter (required by CodeMining)
addAnnotationPainter(sourceViewer);
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/codemining/LineEndCodeMining.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/codemining/LineEndCodeMining.java
index 23861735fed..e52786f1a23 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/codemining/LineEndCodeMining.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/codemining/LineEndCodeMining.java
@@ -27,10 +27,10 @@ public abstract class LineEndCodeMining extends LineContentCodeMining {
private static Position getLineEndPosition(IDocument document, int line) throws BadLocationException {
int lastCharOffset= document.getLineOffset(line) + document.getLineLength(line);
- if (lastCharOffset < document.getLength()) {
- lastCharOffset--; // place on the newline \n char, not on 1st char of next line
- }
- return new Position(lastCharOffset);
+ String delimiter= document.getLineDelimiter(line);
+ return delimiter == null ? // last line of document
+ new Position(document.getLength(), 0) : //
+ new Position(lastCharOffset - delimiter.length(), delimiter.length());
}
}
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/inlined/InlinedAnnotationDrawingStrategy.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/inlined/InlinedAnnotationDrawingStrategy.java
index 2b28b01f071..7a4ba95ef65 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/inlined/InlinedAnnotationDrawingStrategy.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/inlined/InlinedAnnotationDrawingStrategy.java
@@ -143,7 +143,9 @@ class InlinedAnnotationDrawingStrategy implements IDrawingStrategy {
annotation.draw(gc, textWidget, widgetOffset, length, color, 0, 0);
} else {
int line= textWidget.getLineAtOffset(widgetOffset);
- int lineEndOffset= widgetOffset < textWidget.getCharCount() ? widgetOffset : textWidget.getCharCount() - 1;
+ int lineEndOffset= (line == textWidget.getLineCount() - 1) ? //
+ textWidget.getCharCount() - 1 : //
+ textWidget.getOffsetAtLine(line + 1) - 1;
Rectangle bounds= textWidget.getTextBounds(lineEndOffset, lineEndOffset);
int lineEndX= bounds.x + bounds.width + gc.stringExtent(" ").x; //$NON-NLS-1$
annotation.setLocation(lineEndX, textWidget.getLinePixel(line) + textWidget.getLineVerticalIndent(line));
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/inlined/LineContentAnnotation.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/inlined/LineContentAnnotation.java
index 62a17529b33..0c10b8a8106 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/source/inlined/LineContentAnnotation.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/source/inlined/LineContentAnnotation.java
@@ -159,8 +159,14 @@ public class LineContentAnnotation extends AbstractInlinedAnnotation {
}
boolean isEndOfLine(int widgetOffset) {
- return getTextWidget().getCharCount() == 0 || getTextWidget().getCharCount() <= widgetOffset ||
- "\n".equals(getTextWidget().getText(widgetOffset, widgetOffset)); //$NON-NLS-1$
+ StyledText text= getTextWidget();
+ if (text.getCharCount() <= widgetOffset) { // Assuming widgetOffset >= 0
+ return true;
+ }
+ int line= text.getLineAtOffset(widgetOffset);
+ int startOfLine= text.getOffsetAtLine(line);
+ int offsetInLine= widgetOffset - startOfLine;
+ return offsetInLine >= text.getLine(line).length();
}
}

Back to the top