diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter_16Test.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter_16Test.java index 82cc98df2d1..de7c7a22b34 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter_16Test.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter_16Test.java @@ -31,6 +31,7 @@ import org.eclipse.jdt.core.dom.AbstractTypeDeclaration; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.Expression; +import org.eclipse.jdt.core.dom.FieldDeclaration; import org.eclipse.jdt.core.dom.IBinding; import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.ITypeBinding; @@ -69,7 +70,6 @@ public void setUpSuite() throws Exception { public ASTConverter_16Test(String name) { super(name); } - public static Test suite() { return buildModelTestSuite(ASTConverter_16Test.class); } @@ -815,4 +815,36 @@ public boolean visit(VariableDeclarationFragment node) { } }); } + @SuppressWarnings("rawtypes") + public void test_RecordSemicolon() throws JavaModelException { + if (!isJRE16) { + System.err.println("Test "+getName()+" requires a JRE 16"); + return; + } + String contents = + "record Point(int x, int y) {\n" + + " private static final int staticField = 16;\n"+ + "}"; + this.workingCopy = getWorkingCopy("/Converter_16/src/ASTtree.java", true/*resolve*/); + ASTNode node = buildAST( + contents, + this.workingCopy); + assertEquals("Not a compilation unit", ASTNode.COMPILATION_UNIT, node.getNodeType()); + CompilationUnit unit = (CompilationUnit) node; + assertProblemsSize(unit, 0); + node = getASTNode(unit, 0); + assertEquals("Not a record declaration", ASTNode.RECORD_DECLARATION, node.getNodeType()); + RecordDeclaration recordDeclaration = (RecordDeclaration) node; + final List bodyDeclarations = recordDeclaration.bodyDeclarations(); + assertEquals("Wrong size", 1, bodyDeclarations.size()); + FieldDeclaration fieldDeclaration = (FieldDeclaration) bodyDeclarations.get(0); + final List fragments = fieldDeclaration.fragments(); + assertEquals("Wrong size", 1, fragments.size()); + VariableDeclarationFragment fragment = (VariableDeclarationFragment)fragments.get(0); + final Expression initializer = fragment.getInitializer(); + assertEquals("Not a number literal", ASTNode.NUMBER_LITERAL, initializer.getNodeType()); + checkSourceRange(initializer, "16", contents); + + + } } diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingRecordDeclarationTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingRecordDeclarationTest.java index adb2c484c6c..df6671b79e7 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingRecordDeclarationTest.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingRecordDeclarationTest.java @@ -23,6 +23,7 @@ import org.eclipse.jdt.core.dom.Block; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.ExpressionStatement; +import org.eclipse.jdt.core.dom.FieldDeclaration; import org.eclipse.jdt.core.dom.Javadoc; import org.eclipse.jdt.core.dom.MarkerAnnotation; import org.eclipse.jdt.core.dom.MethodDeclaration; @@ -40,6 +41,7 @@ import org.eclipse.jdt.core.dom.Type; import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.jdt.core.dom.TypeParameter; +import org.eclipse.jdt.core.dom.VariableDeclarationFragment; import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; import org.eclipse.jdt.core.dom.rewrite.ListRewrite; @@ -1372,5 +1374,59 @@ public void testRecord_027() throws Exception { } + public void testRecord_028() throws Exception { + if (checkAPILevel()) { + return; + } + IPackageFragment pack1= this.sourceFolder.createPackageFragment("test1", false, null); + StringBuilder buf= new StringBuilder(); + buf.append("package test1;\n"); + buf.append("public class Y {\n"); + buf.append("\n"); + buf.append("}\n"); + ICompilationUnit cu= pack1.createCompilationUnit("Y.java", buf.toString(), false, null); + + CompilationUnit astRoot= createAST(cu); + ASTRewrite rewrite= ASTRewrite.create(astRoot.getAST()); + + AST ast= astRoot.getAST(); + + assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0); + TypeDeclaration type= findTypeDeclaration(astRoot, "Y"); + ListRewrite declarations = rewrite.getListRewrite(type, TypeDeclaration.BODY_DECLARATIONS_PROPERTY); + { + RecordDeclaration record = ast.newRecordDeclaration(); + record.setName(ast.newSimpleName("X")); + + VariableDeclarationFragment variableDeclarationFragment = ast.newVariableDeclarationFragment(); + variableDeclarationFragment.setName(ast.newSimpleName("staticField")); + + FieldDeclaration fieldDeclaration = ast.newFieldDeclaration(variableDeclarationFragment); + fieldDeclaration.setType(ast.newPrimitiveType(PrimitiveType.INT)); + fieldDeclaration.modifiers().add(ast.newModifier(Modifier.ModifierKeyword.PRIVATE_KEYWORD)); + fieldDeclaration.modifiers().add(ast.newModifier(Modifier.ModifierKeyword.STATIC_KEYWORD)); + fieldDeclaration.modifiers().add(ast.newModifier(Modifier.ModifierKeyword.FINAL_KEYWORD)); + + record.bodyDeclarations().add(fieldDeclaration); + + declarations.insertFirst(record, null); + } + + String preview= evaluateRewrite(cu, rewrite); + + buf = new StringBuilder(); + buf.append("package test1;\n"); + buf.append("public class Y {\n"); + buf.append("\n"); + buf.append(" record X() {\n"); + buf.append(" private static final int staticField;\n"); + buf.append(" }\n"); + buf.append("\n"); + buf.append("}\n"); + + assertEqualString(preview, buf.toString()); + + } + } diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.java index b8f58d68e5a..50070a2304e 100644 --- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.java +++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.java @@ -919,7 +919,7 @@ public boolean visit(RecordDeclaration node) { visitList(node, RecordDeclaration.SUPER_INTERFACE_TYPES_PROPERTY, String.valueOf(','), "implements ", Util.EMPTY_STRING); //$NON-NLS-1$ this.result.append('{'); - visitList(node, RecordDeclaration.BODY_DECLARATIONS_PROPERTY, Util.EMPTY_STRING, String.valueOf(';'), Util.EMPTY_STRING); + visitList(node, RecordDeclaration.BODY_DECLARATIONS_PROPERTY, Util.EMPTY_STRING); this.result.append('}'); return false; }