Skip to content

Commit

Permalink
Incorrect startPosition of a SingleVariableDeclaration in the catch b…
Browse files Browse the repository at this point in the history
…lock (#2896)

* Flush all Javadoc comment so far when we exit the try block so that they don't make it to the Exception variable.
  • Loading branch information
subyssurendran666 authored Sep 30, 2024
1 parent 7cd2e50 commit 4833c76
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<ASTNode> statements = block.statements();
TryStatement tryStatement = (TryStatement) statements.get(0);
List<ASTNode> 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<ASTNode> statements = block.statements();
TryStatement tryStatement = (TryStatement) statements.get(0);
List<ASTNode> 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"));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit 4833c76

Please sign in to comment.