4242import org .eclipse .core .runtime .ILog ;
4343import org .eclipse .core .runtime .Platform ;
4444import org .eclipse .jface .text .AbstractDocument ;
45+ import org .eclipse .jface .text .BadLocationException ;
4546import org .eclipse .jface .text .ITextViewerExtension5 ;
4647import org .eclipse .jface .text .source .ISourceViewer ;
4748import org .eclipse .swt .custom .StyledText ;
@@ -68,8 +69,11 @@ public List<IStickyLine> getStickyLines(ISourceViewer sourceViewer, int lineNumb
6869 StickyLinesProperties properties ) {
6970 final long startTime = System .currentTimeMillis ();
7071 final LinkedList <IStickyLine > stickyLines = new LinkedList <>();
72+ // lineNumber in the zero-based line number as known to the IDocument
73+ // textWidgetLineNumber is the the line number as known to the ISourceViewer
7174 final int textWidgetLineNumber = mapLineNumberToWidget (sourceViewer , lineNumber );
72- final int fileLineNumber = textWidgetLineNumber + 1 ;
75+ // fileLineNumber is the 1-based line number as known to the AST and the underlying source file
76+ final int fileLineNumber = lineNumber + 1 ;
7377 if (DEBUG ) {
7478 System .out .println ("Sticky lines request at source line: " + fileLineNumber ); //$NON-NLS-1$
7579 }
@@ -111,8 +115,14 @@ public List<IStickyLine> getStickyLines(ISourceViewer sourceViewer, int lineNumb
111115 final StyledText textWidget = sourceViewer .getTextWidget ();
112116 final IASTNodeSelector nodeSelector = fAst .getNodeSelector (fAst .getFilePath ());
113117 final String line = textWidget .getLine (textWidgetLineNumber );
114- final int offset = textWidget .getOffsetAtLine (textWidgetLineNumber );
115- IASTNode node = nodeSelector .findEnclosingNode (offset , line .length ());
118+ IASTNode node = null ;
119+ try {
120+ final int offset = sourceViewer .getDocument ().getLineOffset (lineNumber );
121+ node = nodeSelector .findEnclosingNode (offset , line .length ());
122+ } catch (BadLocationException e ) {
123+ ILog .get ().error ("Error getting line offset for sticky lines" , e ); //$NON-NLS-1$
124+ return stickyLines ;
125+ }
116126
117127 // process sticky ancestor nodes
118128 while (null != node ) {
@@ -191,21 +201,22 @@ private void processElseClause(IASTIfStatement ifStatement, int fileLineNumber,
191201 final int startingLineNumber = ifStatement .getThenClause ().getFileLocation ().getEndingLineNumber ();
192202 final int endingLineNumber = Math .min (elseClause .getFileLocation ().getStartingLineNumber (), fileLineNumber - 1 );
193203 final StyledText textWidget = sourceViewer .getTextWidget ();
194- for (int lineNumber = endingLineNumber ; lineNumber >= startingLineNumber ; lineNumber --) {
195- if (textWidget .getLine (lineNumber - 1 ).contains ("else" )) { //$NON-NLS-1$
196- addStickyLine (lineNumber , sourceViewer , stickyLines );
204+ for (int fileLineNum = endingLineNumber ; fileLineNum >= startingLineNumber ; fileLineNum --) {
205+ final int textWidgetLineNumber = mapLineNumberToWidget (sourceViewer , fileLineNum - 1 );
206+ if (textWidget .getLine (textWidgetLineNumber ).contains ("else" )) { //$NON-NLS-1$
207+ addStickyLine (fileLineNum , sourceViewer , stickyLines );
197208 }
198209 }
199210 }
200211
201- private void addStickyLine (int sourceLineNumber , ISourceViewer sourceViewer , LinkedList <IStickyLine > stickyLines ) {
202- final int textWidgetLineNumber = sourceLineNumber - 1 ;
212+ private void addStickyLine (int fileLineNumber , ISourceViewer sourceViewer , LinkedList <IStickyLine > stickyLines ) {
213+ final int lineNumber = fileLineNumber - 1 ;
203214 // suppress duplicate sticky lines
204- if (stickyLines .isEmpty () || (stickyLines .getFirst ().getLineNumber () > textWidgetLineNumber )) {
215+ if (stickyLines .isEmpty () || (stickyLines .getFirst ().getLineNumber () > lineNumber )) {
205216 if (DEBUG ) {
206- System .out .println ("> Sticky line: " + sourceLineNumber ); //$NON-NLS-1$
217+ System .out .println ("> Sticky line: " + fileLineNumber ); //$NON-NLS-1$
207218 }
208- stickyLines .addFirst (new StickyLine (textWidgetLineNumber , sourceViewer ));
219+ stickyLines .addFirst (new StickyLine (lineNumber , sourceViewer ));
209220 }
210221 }
211222
@@ -221,11 +232,11 @@ private ICElement getInputElement(IEditorPart part) {
221232 return null ;
222233 }
223234
224- private int mapLineNumberToWidget (ISourceViewer sourceViewer , int line ) {
235+ private int mapLineNumberToWidget (ISourceViewer sourceViewer , int lineNumber ) {
225236 if (sourceViewer instanceof ITextViewerExtension5 extension ) {
226- return extension .modelLine2WidgetLine (line ); // -1 if line not found
237+ return extension .modelLine2WidgetLine (lineNumber ); // -1 if line not found
227238 }
228- return line ;
239+ return lineNumber ;
229240 }
230241
231242}
0 commit comments