Skip to content

Commit 67b6f49

Browse files
committed
More logic changes
- make sure to translate from text widget line numbers to regular line numbers when getting ast nodes and translate to text widget line numbers when fetching lines - do not destroy read only compilation unit - do not display items that are past the current line number
1 parent 90f4d46 commit 67b6f49

File tree

1 file changed

+18
-12
lines changed

1 file changed

+18
-12
lines changed

org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaStickyLinesProvider.java

+18-12
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import org.eclipse.jdt.core.dom.SwitchExpression;
5555
import org.eclipse.jdt.core.dom.SwitchStatement;
5656
import org.eclipse.jdt.core.dom.TryStatement;
57+
import org.eclipse.jdt.core.dom.TypeDeclarationStatement;
5758
import org.eclipse.jdt.core.dom.WhileStatement;
5859

5960
import org.eclipse.jdt.internal.corext.dom.IASTSharedValues;
@@ -104,7 +105,7 @@ public List<IStickyLine> getStickyLines(ISourceViewer sourceViewer, int lineNumb
104105
unit= typeRoot.getWorkingCopy(workingCopyOwner, null);
105106
if (unit != null) {
106107
CompilationUnit cu= convertICompilationUnitToCompilationUnit(unit);
107-
node= getASTNode(cu, textWidgetLineNumber+1, line);
108+
node= getASTNode(cu, mapWidgetToLineNumber(sourceViewer, textWidgetLineNumber)+1, line);
108109
while (node == null && textWidgetLineNumber > 0) {
109110
line= textWidget.getLine(--textWidgetLineNumber);
110111
startIndentation= getIndentation(line);
@@ -113,9 +114,9 @@ public List<IStickyLine> getStickyLines(ISourceViewer sourceViewer, int lineNumb
113114
startIndentation= getIndentation(line);
114115
}
115116
if (textWidgetLineNumber > 0) {
116-
int position= cu.getPosition(textWidgetLineNumber + 1, startIndentation);
117+
int position= cu.getPosition(mapWidgetToLineNumber(sourceViewer, textWidgetLineNumber) + 1, startIndentation);
117118
if (position >= 0) {
118-
node= getASTNode(cu, textWidgetLineNumber+1, line);
119+
node= getASTNode(cu, mapWidgetToLineNumber(sourceViewer, textWidgetLineNumber)+1, line);
119120
}
120121
}
121122
}
@@ -132,6 +133,11 @@ public List<IStickyLine> getStickyLines(ISourceViewer sourceViewer, int lineNumb
132133
ASTNode name= ((AbstractTypeDeclaration)node).getName();
133134
nodeLineNumber= cu.getLineNumber(name.getStartPosition());
134135
break;
136+
case ASTNode.TYPE_DECLARATION_STATEMENT:
137+
addStickyLine= true;
138+
ASTNode typeDeclStmtName= ((TypeDeclarationStatement)node).getDeclaration().getName();
139+
nodeLineNumber= cu.getLineNumber(typeDeclStmtName.getStartPosition());
140+
break;
135141
case ASTNode.METHOD_DECLARATION:
136142
addStickyLine= true;
137143
ASTNode methodName= ((MethodDeclaration)node).getName();
@@ -160,14 +166,14 @@ public List<IStickyLine> getStickyLines(ISourceViewer sourceViewer, int lineNumb
160166
Statement elseStmt= ifStmt.getElseStatement();
161167
if (elseStmt != null) {
162168
int elseLine= cu.getLineNumber(elseStmt.getStartPosition());
163-
if (elseLine <= textWidgetLineNumber + 1) {
169+
if (elseLine <= mapWidgetToLineNumber(sourceViewer, textWidgetLineNumber + 1)) {
164170
Pattern p= ELSE_PATTERN;
165171
nodeLineNumber= elseLine;
166-
String stmtLine= textWidget.getLine(nodeLineNumber - 1);
172+
String stmtLine= textWidget.getLine(mapLineNumberToWidget(sourceViewer, nodeLineNumber - 1));
167173
Matcher m= p.matcher(stmtLine);
168174
while (!m.find() && nodeLineNumber > 1) {
169175
nodeLineNumber--;
170-
stmtLine= textWidget.getLine(nodeLineNumber - 1);
176+
stmtLine= textWidget.getLine(mapLineNumberToWidget(sourceViewer, nodeLineNumber - 1));
171177
m= p.matcher(stmtLine);
172178
}
173179
node= node.getParent();
@@ -219,11 +225,11 @@ public List<IStickyLine> getStickyLines(ISourceViewer sourceViewer, int lineNumb
219225
}
220226
if (bodyProperty != null && pattern != null) {
221227
nodeLineNumber= cu.getLineNumber(bodyProperty.getStartPosition());
222-
String stmtLine= textWidget.getLine(nodeLineNumber - 1);
228+
String stmtLine= textWidget.getLine(mapLineNumberToWidget(sourceViewer, nodeLineNumber - 1));
223229
Matcher m= pattern.matcher(stmtLine);
224230
while (!m.find() && nodeLineNumber > 1) {
225231
nodeLineNumber--;
226-
stmtLine= textWidget.getLine(nodeLineNumber - 1);
232+
stmtLine= textWidget.getLine(mapLineNumberToWidget(sourceViewer, nodeLineNumber - 1));
227233
m= pattern.matcher(stmtLine);
228234
}
229235
}
@@ -237,20 +243,20 @@ public List<IStickyLine> getStickyLines(ISourceViewer sourceViewer, int lineNumb
237243
default:
238244
break;
239245
}
240-
if (addStickyLine) {
241-
stickyLines.addFirst(new StickyLine(mapWidgetToLineNumber(sourceViewer, nodeLineNumber - 1), sourceViewer));
246+
if (addStickyLine && nodeLineNumber <= lineNumber) {
247+
stickyLines.addFirst(new StickyLine(nodeLineNumber - 1, sourceViewer));
242248
}
243249
if (node.getNodeType() == ASTNode.MODIFIER) {
244250
Modifier modifier= (Modifier)node;
245251
startIndentation+= modifier.getLength();
246-
node= getASTNode(cu, textWidgetLineNumber+1, line);
252+
node= getASTNode(cu, mapWidgetToLineNumber(sourceViewer, textWidgetLineNumber+1), line);
247253
} else {
248254
node= node.getParent();
249255
}
250256
}
251257
}
252258
}
253-
if (unit != null) {
259+
if (unit != null && !typeRoot.isReadOnly()) {
254260
unit.discardWorkingCopy();
255261
}
256262
} catch (JavaModelException e) {

0 commit comments

Comments
 (0)