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>
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 ef74891..20236a6 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 @@ + "// 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 2386173..e52786f 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 @@ 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 2b28b01..7a4ba95 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 @@ 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 62a1752..0c10b8a 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 @@ } 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(); } }