Skip to content

Commit 48820de

Browse files
committed
Accommodate folding regions in sticky lines provider
1 parent 0d7f740 commit 48820de

1 file changed

Lines changed: 25 additions & 14 deletions

File tree

core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CSourceStickyLinesProvider.java

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.eclipse.core.runtime.ILog;
4343
import org.eclipse.core.runtime.Platform;
4444
import org.eclipse.jface.text.AbstractDocument;
45+
import org.eclipse.jface.text.BadLocationException;
4546
import org.eclipse.jface.text.ITextViewerExtension5;
4647
import org.eclipse.jface.text.source.ISourceViewer;
4748
import 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

Comments
 (0)