diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java index 178fdf087d3..4d218aa2646 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java @@ -5483,4 +5483,65 @@ interface I { assertEquals(1, variableElement.getSourceRange().getLength()); } +public void testSVDStartPositionIssue_1() throws JavaModelException { + String contents = """ + public class X { + public static void example() { + try { + System.out.println("try"); + } + /** */ + catch (RuntimeException e) { + System.out.println("catch"); + } + } + } + """; + this.workingCopy = getWorkingCopy("/Converter22/src/xyz/X.java", true/*resolve*/); + CompilationUnit cu = (CompilationUnit) buildAST(contents, this.workingCopy); + TypeDeclaration typedeclaration = (TypeDeclaration) getASTNode(cu, 0); + MethodDeclaration methodDeclaration = (MethodDeclaration) typedeclaration.bodyDeclarations().get(0); + Block block = methodDeclaration.getBody(); + List statements = block.statements(); + TryStatement tryStatement = (TryStatement) statements.get(0); + List catchClauseList = tryStatement.catchClauses(); + CatchClause catchClause = (CatchClause) catchClauseList.get(0); + SingleVariableDeclaration svd = catchClause.getException(); + + assertEquals("Not a Single Variable Declaration", ASTNode.SINGLE_VARIABLE_DECLARATION, svd.getNodeType()); + assertEquals("Not a Simple Type", ASTNode.SIMPLE_TYPE, svd.getType().getNodeType()); + assertEquals("Not a Simple Name", ASTNode.SIMPLE_NAME, svd.getName().getNodeType()); + assertEquals("Single Variable Declaration length is not correct", svd.getLength(), contents.substring(contents.indexOf("RuntimeException e")).indexOf(')')); + assertEquals("Single Variable Declaration startPosition is not correct", svd.getStartPosition(), contents.indexOf("RuntimeException")); +} + +public void testSVDStartPositionIssue_2() throws JavaModelException { + String contents = """ + public class X { + public static void example() { + try { + System.out.println("try"); + } + /** */ + catch(/** abc*/ RuntimeException e) { + System.out.println("catch"); + } + } + } + """; + this.workingCopy = getWorkingCopy("/Converter22/src/xyz/X.java", true/*resolve*/); + CompilationUnit cu = (CompilationUnit) buildAST(contents, this.workingCopy); + TypeDeclaration typedeclaration = (TypeDeclaration) getASTNode(cu, 0); + MethodDeclaration methodDeclaration = (MethodDeclaration) typedeclaration.bodyDeclarations().get(0); + Block block = methodDeclaration.getBody(); + List statements = block.statements(); + TryStatement tryStatement = (TryStatement) statements.get(0); + List catchClauseList = tryStatement.catchClauses(); + CatchClause catchClause = (CatchClause) catchClauseList.get(0); + SingleVariableDeclaration svd = catchClause.getException(); + + assertEquals("Single Variable Declaration length is not correct", svd.getLength(), contents.substring(contents.indexOf("/** abc*/ RuntimeException e")).indexOf(')')); + assertEquals("Single Variable Declaration startPosition is not correct", svd.getStartPosition(), contents.indexOf("/** abc*/ RuntimeException")); +} + } diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/CommentRecorderParser.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/CommentRecorderParser.java index db43a7c6a1f..eae734262ab 100644 --- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/CommentRecorderParser.java +++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/CommentRecorderParser.java @@ -195,6 +195,12 @@ public int flushCommentsDefinedPriorTo(int position) { return position; } + @Override + protected void consumeExitTryBlock() { + flushCommentsDefinedPriorTo(this.scanner.currentPosition); + super.consumeExitTryBlock(); + } + protected int getCommentPtr() { int lastComment = this.scanner.commentPtr; if (lastComment == -1 && this.currentElement != null) {