This is an automated email from the ASF dual-hosted git repository. sunlan pushed a commit to branch GROOVY_3_0_X in repository https://gitbox.apache.org/repos/asf/groovy.git
commit b8e0c1e225342f80cb9382edd09f53756054a7ba Author: Eric Milles <[email protected]> AuthorDate: Mon Jan 20 11:48:30 2020 -0600 support for enum constant with trailing comma and semicolon enum E { A, B, ; } (cherry picked from commit 8f051fb2217d66622e231b7d377c4896e8f14f93) --- src/main/antlr2/org/codehaus/groovy/antlr/groovy.g | 4 +- .../groovy/antlr/EnumSourceParsingTest.java | 161 +++++++++++---------- .../test/resources/core/EnumDeclaration_02.groovy | 2 - 3 files changed, 88 insertions(+), 79 deletions(-) diff --git a/src/main/antlr2/org/codehaus/groovy/antlr/groovy.g b/src/main/antlr2/org/codehaus/groovy/antlr/groovy.g index 41d5e29..1f70720 100644 --- a/src/main/antlr2/org/codehaus/groovy/antlr/groovy.g +++ b/src/main/antlr2/org/codehaus/groovy/antlr/groovy.g @@ -1138,7 +1138,7 @@ enumConstants : enumConstant ( options {generateAmbigWarnings=false;} : - (nls (SEMI | enumConstantsEnd)) => {break;} // GROOVY-4438, GROOVY-9184 + (nls enumConstantsEnd) => {break;} // GROOVY-4438, GROOVY-9184 | nls! COMMA! ( (nls enumConstantsEnd) => {break;} // GROOVY-8507, GROOVY-9301 @@ -1152,7 +1152,7 @@ enumConstants enumConstantsEnd options {generateAmbigWarnings=false;} - : RCURLY | declarationStart | constructorStart | typeDefinitionStart + : SEMI | RCURLY | declarationStart | constructorStart | typeDefinitionStart ; // An annotation field diff --git a/src/test/org/codehaus/groovy/antlr/EnumSourceParsingTest.java b/src/test/org/codehaus/groovy/antlr/EnumSourceParsingTest.java index fd24cb4..62162bc 100644 --- a/src/test/org/codehaus/groovy/antlr/EnumSourceParsingTest.java +++ b/src/test/org/codehaus/groovy/antlr/EnumSourceParsingTest.java @@ -25,47 +25,72 @@ import java.io.StringReader; */ public final class EnumSourceParsingTest extends SourceParserTest { - public void testParseEnumConstants() { + public void testParseEnumConstants1() { + parse(getMethodName(), new StringReader( + "enum E { X, Y, Z }\n" + )); + } + + public void testParseEnumConstants2() { parse(getMethodName(), new StringReader( "enum E {\n" + " X, Y, Z\n" + - "}\n") - ); + "}\n" + )); + } + + public void testParseEnumConstants3() { + parse(getMethodName(), new StringReader( + "enum E {\n" + + " X,\n" + + " Y,\n" + + " Z,\n" + + "}\n" + )); } - public void testParseEnumConstantsMultiLine() { + public void testParseEnumConstants4() { parse(getMethodName(), new StringReader( "enum E {\n" + " X,\n" + " Y,\n" + " Z,\n" + - "}\n") - ); + " ;\n" + + "}\n" + )); } - public void testParseEnumConstantsMultiLine2() { + public void testParseEnumConstants5() { parse(getMethodName(), new StringReader( "enum E\n" + "{\n" + " X,\n" + " Y,\n" + " Z\n" + - "}\n") - ); + "}\n" + )); } - public void testParseEnumImplementsMultiLine() { + public void testParseEnumImplements1() { + parse(getMethodName(), new StringReader( + "enum E implements I {\n" + + " X, Y, Z\n" + + "}\n" + )); + } + + public void testParseEnumImplements2() { parse(getMethodName(), new StringReader( "enum E implements I\n" + "{\n" + " X,\n" + " Y,\n" + " Z\n" + - "}\n") - ); + "}\n" + )); } - public void testParseEnumImplementsMultiLine2() { + public void testParseEnumImplements3() { parse(getMethodName(), new StringReader( "enum E\n" + "implements I\n" + @@ -73,22 +98,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { " X,\n" + " Y,\n" + " Z\n" + - "}\n") - ); - } - - public void testParseEnumConstantsOneLiner() { - parse(getMethodName(), new StringReader( - "enum E { X, Y, Z }\n") - ); - } - - public void testParseEnumImplements() { - parse(getMethodName(), new StringReader( - "enum E implements I {\n" + - " X, Y, Z\n" + - "}\n") - ); + "}\n" + )); } public void testParseEnumWithValues() { @@ -99,8 +110,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { " this.value = value\n" + " }\n\n" + " private final int value\n" + - "}\n") - ); + "}\n" + )); } public void testParseEnumWithValues2() { @@ -111,8 +122,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { " this.value = value\n" + " }\n\n" + " private final int value\n" + - "}\n") - ); + "}\n" + )); } public void testParseEnumWithValues3() { @@ -123,8 +134,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { " E(value) {\n" + " this.value = value\n" + " }\n" + - "}\n") - ); + "}\n" + )); } // GROOVY-9301 @@ -136,8 +147,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { " E(value) {\n" + " this.value = value\n" + " }\n" + - "}\n") - ); + "}\n" + )); } public void testParseEnumWithValues4() { @@ -156,8 +167,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { " Suit(Color color) {\n" + " this.color = color\n" + " }\n" + - "}\n") - ); + "}\n" + )); } public void testParseEnumWithMethodDefinitions1() { @@ -167,8 +178,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { " def m1() { }\n" + " public m2(args) { }\n" + " int m3(String arg) { }\n" + - "}\n") - ); + "}\n" + )); } public void testParseEnumWithMethodDefinitions2() { @@ -176,8 +187,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { "enum E {\n" + " X, Y, Z\n\n" + " def <T> T m() { }\n" + - "}\n") - ); + "}\n" + )); } public void testParseEnumWithMethodDefinitions2a() { @@ -185,8 +196,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { "enum E {\n" + " X, Y, Z\n\n" + " final <T> T m() { }\n" + - "}\n") - ); + "}\n" + )); } public void testParseEnumWithMethodDefinitions2b() { @@ -194,8 +205,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { "enum E {\n" + " X, Y, Z\n\n" + " public <T> T m() { }\n" + - "}\n") - ); + "}\n" + )); } public void testParseEnumWithAnnotatedMethodDefinition1() { @@ -207,8 +218,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { " String toString() {\n" + " name().toLowerCase().capitalize()\n" + " }\n" + - "}\n") - ); + "}\n" + )); } // GROOVY-9301 @@ -221,8 +232,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { " String toString() {\n" + " name().toLowerCase().capitalize()\n" + " }\n" + - "}\n") - ); + "}\n" + )); } // GROOVY-9301 @@ -233,8 +244,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { " \n" + " @Deprecated <T> T whatever() {\n" + " }\n" + - "}\n") - ); + "}\n" + )); } public void testParseCompleteEnum() { @@ -244,8 +255,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { " Y {\n" + " double eval(int v) { return (double) v + 1 }\n" + " }, Z\n" + - "}") - ); + "}" + )); } public void testParseEnumWithInnerClass1() { @@ -253,8 +264,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { "enum E {\n" + " X, Y, Z\n" + " class C { }\n" + - "}\n") - ); + "}\n" + )); } // GROOVY-8507 @@ -263,8 +274,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { "enum E {\n" + " X, Y, Z,\n" + // trailing comma " class C { }\n" + - "}\n") - ); + "}\n" + )); } public void testParseEnumWithInnerClass2() { @@ -272,8 +283,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { "enum E {\n" + " X, Y, Z\n" + " enum E2 { A, B, C }\n" + - "}\n") - ); + "}\n" + )); } // GROOVY-8507 @@ -282,8 +293,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { "enum E {\n" + " X, Y, Z,\n" + // trailing comma " enum Another { A, B, C }\n" + - "}\n") - ); + "}\n" + )); } public void testParseEnumWithInnerClass3() { @@ -291,8 +302,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { "enum E {\n" + " X, Y, Z\n" + " interface I { }\n" + - "}\n") - ); + "}\n" + )); } // GROOVY-8507 @@ -301,8 +312,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { "enum E {\n" + " X, Y, Z,\n" + // trailing comma " interface I { }\n" + - "}\n") - ); + "}\n" + )); } public void _FIXME_testParseEnumWithInnerClass4() { @@ -310,8 +321,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { "enum E {\n" + " X, Y, Z\n" + " @interface A { }\n" + - "}\n") - ); + "}\n" + )); } public void _FIXME_testParseEnumWithInnerClass4a() { @@ -319,8 +330,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { "enum E {\n" + " X, Y, Z,\n" + // trailing comma " @interface A { }\n" + - "}\n") - ); + "}\n" + )); } public void testParseEnumWithInnerClass5() { @@ -328,8 +339,8 @@ public final class EnumSourceParsingTest extends SourceParserTest { "enum E {\n" + " X, Y, Z\n" + " trait T { }\n" + - "}\n") - ); + "}\n" + )); } // GROOVY-8507 @@ -338,7 +349,7 @@ public final class EnumSourceParsingTest extends SourceParserTest { "enum E {\n" + " X, Y, Z,\n" + // trailing comma " trait T { }\n" + - "}\n") - ); + "}\n" + )); } } diff --git a/subprojects/parser-antlr4/src/test/resources/core/EnumDeclaration_02.groovy b/subprojects/parser-antlr4/src/test/resources/core/EnumDeclaration_02.groovy index aef6b4a..b4d8d13 100644 --- a/subprojects/parser-antlr4/src/test/resources/core/EnumDeclaration_02.groovy +++ b/subprojects/parser-antlr4/src/test/resources/core/EnumDeclaration_02.groovy @@ -74,13 +74,11 @@ enum J { B, } -/* // antlr2 parser does not support the following code since some beta/rc release of 3.0.0 enum K { A, B, ; } -*/ enum Outer { A, B
