diff --git a/javaparser-core-testing/src/test/java/com/github/javaparser/ast/body/RecordDeclarationTest.java b/javaparser-core-testing/src/test/java/com/github/javaparser/ast/body/RecordDeclarationTest.java index a9017579b3..c3b60b2c6f 100644 --- a/javaparser-core-testing/src/test/java/com/github/javaparser/ast/body/RecordDeclarationTest.java +++ b/javaparser-core-testing/src/test/java/com/github/javaparser/ast/body/RecordDeclarationTest.java @@ -271,6 +271,26 @@ void record_permitStaticFields() { assertOneRecordDeclaration(cu); } + @Test + void record_permitPublicStaticFieldInRecord1() { + String s = "public final record RecordPublicField() {" + + " public static final Object EMPTY = new Object();" + + "}\n"; + CompilationUnit cu = TestParser.parseCompilationUnit(s); + assertOneRecordDeclaration(cu); + } + + @Test + void record_permitPublicStaticFieldInNestedRecord() { + String s = "public final record RecordTopLevel(Object member) {\n" + + " private static record RecordNested() {\n" + + " public static final RecordNested EMPTY = new RecordNested();\n" + + " }\n" + + "}\n"; + CompilationUnit cu = TestParser.parseCompilationUnit(s); + assertTwoRecordDeclarations(cu); + } + @Test void record_permitStaticFields2() { String s = "" + @@ -717,4 +737,9 @@ private void assertOneRecordDeclaration(CompilationUnit cu) { List recordDeclarations = cu.findAll(RecordDeclaration.class); assertEquals(1, recordDeclarations.size()); } + + private void assertTwoRecordDeclarations(CompilationUnit cu) { + List recordDeclarations = cu.findAll(RecordDeclaration.class); + assertEquals(2, recordDeclarations.size()); + } } diff --git a/javaparser-core/src/main/javacc/java.jj b/javaparser-core/src/main/javacc/java.jj index 25d3c41a40..ff1b6babb8 100644 --- a/javaparser-core/src/main/javacc/java.jj +++ b/javaparser-core/src/main/javacc/java.jj @@ -1292,13 +1292,14 @@ ModifierHolder Modifiers(): * Also note that JavaParser handles the hierarchy/specialisations of classes, interfaces, and enums differently to the JLS. * - * https://docs.oracle.com/javase/specs/jls/se15/html/jls-8.html#jls-8.1 + * https://docs.oracle.com/javase/specs/jls/se17/html/jls-8.html#jls-8.1 *
{@code
  *     ClassDeclaration:
  *         NormalClassDeclaration
  *         EnumDeclaration
+ *         RecordDeclaration
  *     NormalClassDeclaration:
  *         {ClassModifier} class TypeIdentifier [TypeParameters] [Superclass] [Superinterfaces] ClassBody
  * }
@@ -1339,11 +1340,11 @@ ClassOrInterfaceDeclaration ClassOrInterfaceDeclaration(ModifierHolder modifier) } /** - * https://openjdk.java.net/jeps/395#Java-grammar + * https://docs.oracle.com/javase/specs/jls/se17/html/jls-8.html#jls-8.10 *
{@code
  *     RecordDeclaration:
  *        {ClassModifier} `record` TypeIdentifier [TypeParameters]
- *          RecordHeader [SuperInterfaces] RecordBody
+ *          RecordHeader [ClassImplements] RecordBody
  *
  *      RecordHeader:
  *       `(` [RecordComponentList] `)`
@@ -1352,11 +1353,14 @@ ClassOrInterfaceDeclaration ClassOrInterfaceDeclaration(ModifierHolder modifier)
  *       RecordComponent { `,` RecordComponent}
  *
  *      RecordComponent:
- *       {Annotation} UnannType Identifier
+ *       {RecordComponentModifier} UnannType Identifier
  *       VariableArityRecordComponent
  *
  *      VariableArityRecordComponent:
- *       {Annotation} UnannType {Annotation} `...` Identifier
+ *       {RecordComponentModifier} UnannType {Annotation} `...` Identifier
+ *
+ *      RecordComponentModifier:
+ *       Annotation
  *
  *      RecordBody:
  *        `{` {RecordBodyDeclaration} `}`
@@ -1781,6 +1785,9 @@ BodyDeclaration RecordBodyDeclaration():
          |
             LOOKAHEAD("enum")
             ret = EnumDeclaration(modifiers)
+         |
+            LOOKAHEAD("record")
+            ret = RecordDeclaration(modifiers)
          |
             LOOKAHEAD("@" "interface")
             ret = AnnotationTypeDeclaration(modifiers)