5454import org .eclipse .jdt .core .dom .SwitchExpression ;
5555import org .eclipse .jdt .core .dom .SwitchStatement ;
5656import org .eclipse .jdt .core .dom .TryStatement ;
57+ import org .eclipse .jdt .core .dom .TypeDeclarationStatement ;
5758import org .eclipse .jdt .core .dom .WhileStatement ;
5859
5960import 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