[groovy] 01/01: GROOVY-9522: Throwing NPE when I use ternary operator with something special
This is an automated email from the ASF dual-hosted git repository. sunlan pushed a commit to branch GROOVY-9522 in repository https://gitbox.apache.org/repos/asf/groovy.git commit ed04da9a178d92d0e27bc39129141398f942edee Author: Daniel Sun AuthorDate: Tue May 12 08:25:16 2020 +0800 GROOVY-9522: Throwing NPE when I use ternary operator with something special --- src/antlr/GroovyParser.g4 | 46 -- .../apache/groovy/parser/antlr4/AstBuilder.java| 18 - .../groovy/parser/antlr4/GroovyParserTest.groovy | 4 ++ .../src/test/resources/bugs/BUG-GROOVY-9522.groovy | 37 + 4 files changed, 93 insertions(+), 12 deletions(-) diff --git a/src/antlr/GroovyParser.g4 b/src/antlr/GroovyParser.g4 index 29f347c..47b212c 100644 --- a/src/antlr/GroovyParser.g4 +++ b/src/antlr/GroovyParser.g4 @@ -1008,6 +1008,13 @@ options { baseContext = primary; } | parExpression #parenPrmrAlt ; +namedArgPrimary +options { baseContext = primary; } +: identifier #identifierPrmrAlt +| literal #literalPrmrAlt +| gstring #gstringPrmrAlt +; + commandPrimary options { baseContext = primary; } : identifier #identifierPrmrAlt @@ -1047,6 +1054,12 @@ options { baseContext = mapEntry; } | MUL COLON nls expression ; +namedArg +options { baseContext = mapEntry; } +: namedArgLabel COLON nls expression +| MUL COLON nls expression +; + mapEntryLabel : keywords | primary @@ -1058,6 +1071,12 @@ options { baseContext = mapEntryLabel; } | namedPropertyArgPrimary ; +namedArgLabel +options { baseContext = mapEntryLabel; } +: keywords +| namedArgPrimary +; + /** * t 0: general creation; 1: non-static inner class creation */ @@ -1100,30 +1119,51 @@ typeArgumentsOrDiamond ; arguments -: LPAREN enhancedArgumentList? COMMA? rparen +: LPAREN enhancedArgumentListInPar? COMMA? rparen ; argumentList -options { baseContext = enhancedArgumentList; } -: argumentListElement +options { baseContext = enhancedArgumentListInPar; } +: firstArgumentListElement ( COMMA nls argumentListElement )* ; enhancedArgumentList +options { baseContext = enhancedArgumentListInPar; } +: firstEnhancedArgumentListElement +( COMMA nls +enhancedArgumentListElement +)* +; + +enhancedArgumentListInPar : enhancedArgumentListElement ( COMMA nls enhancedArgumentListElement )* ; +firstArgumentListElement +options { baseContext = enhancedArgumentListElement; } +: expressionListElement[true] +| namedArg +; + argumentListElement options { baseContext = enhancedArgumentListElement; } : expressionListElement[true] | namedPropertyArg ; +firstEnhancedArgumentListElement +options { baseContext = enhancedArgumentListElement; } +: expressionListElement[true] +| standardLambdaExpression +| namedArg +; + enhancedArgumentListElement : expressionListElement[true] | standardLambdaExpression diff --git a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java index b366212..d5f80d1 100644 --- a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java +++ b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java @@ -201,8 +201,8 @@ import static org.apache.groovy.parser.antlr4.GroovyLangParser.ElementValuePairs import static org.apache.groovy.parser.antlr4.GroovyLangParser.ElementValuesContext; import static org.apache.groovy.parser.antlr4.GroovyLangParser.EmptyDimsContext; import static org.apache.groovy.parser.antlr4.GroovyLangParser.EmptyDimsOptContext; -import static org.apache.groovy.parser.antlr4.GroovyLangParser.EnhancedArgumentListContext; import static org.apache.groovy.parser.antlr4.GroovyLangParser.EnhancedArgumentListElementContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.EnhancedArgumentListInParContext; import static org.apache.groovy.parser.antlr4.GroovyLangParser.EnhancedForControlContext; import static org.apache.groovy.parser.antlr4.GroovyLangParser.EnhancedStatementExpressionContext; import static org.apache.groovy.parser.antlr4.GroovyLangParser.EnumConstantContext; @@ -2018,7 +2018,7 @@ public class AstBuilder extends GroovyParserBaseVisitor { @Override
[groovy] 01/01: GROOVY-9522: Throwing NPE when I use ternary operator with something special
This is an automated email from the ASF dual-hosted git repository. sunlan pushed a commit to branch GROOVY-9522 in repository https://gitbox.apache.org/repos/asf/groovy.git commit 534f99313d40131d02821ece711a97593d918ee6 Author: Daniel Sun AuthorDate: Tue May 12 08:03:23 2020 +0800 GROOVY-9522: Throwing NPE when I use ternary operator with something special --- src/antlr/GroovyParser.g4 | 36 -- .../groovy/parser/antlr4/GroovyParserTest.groovy | 4 +++ .../src/test/resources/bugs/BUG-GROOVY-9522.groovy | 32 +++ 3 files changed, 70 insertions(+), 2 deletions(-) diff --git a/src/antlr/GroovyParser.g4 b/src/antlr/GroovyParser.g4 index 29f347c..f564a8a 100644 --- a/src/antlr/GroovyParser.g4 +++ b/src/antlr/GroovyParser.g4 @@ -1008,6 +1008,13 @@ options { baseContext = primary; } | parExpression #parenPrmrAlt ; +namedArgPrimary +options { baseContext = primary; } +: identifier #identifierPrmrAlt +| literal #literalPrmrAlt +| gstring #gstringPrmrAlt +; + commandPrimary options { baseContext = primary; } : identifier #identifierPrmrAlt @@ -1047,6 +1054,12 @@ options { baseContext = mapEntry; } | MUL COLON nls expression ; +namedArg +options { baseContext = mapEntry; } +: namedArgLabel COLON nls expression +| MUL COLON nls expression +; + mapEntryLabel : keywords | primary @@ -1058,6 +1071,12 @@ options { baseContext = mapEntryLabel; } | namedPropertyArgPrimary ; +namedArgLabel +options { baseContext = mapEntryLabel; } +: keywords +| namedArgPrimary +; + /** * t 0: general creation; 1: non-static inner class creation */ @@ -1105,25 +1124,38 @@ arguments argumentList options { baseContext = enhancedArgumentList; } -: argumentListElement +: firstArgumentListElement ( COMMA nls argumentListElement )* ; enhancedArgumentList -: enhancedArgumentListElement +: firstEnhancedArgumentListElement ( COMMA nls enhancedArgumentListElement )* ; +firstArgumentListElement +options { baseContext = enhancedArgumentListElement; } +: expressionListElement[true] +| namedArg +; + argumentListElement options { baseContext = enhancedArgumentListElement; } : expressionListElement[true] | namedPropertyArg ; +firstEnhancedArgumentListElement +options { baseContext = enhancedArgumentListElement; } +: expressionListElement[true] +| standardLambdaExpression +| namedArg +; + enhancedArgumentListElement : expressionListElement[true] | standardLambdaExpression diff --git a/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/GroovyParserTest.groovy b/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/GroovyParserTest.groovy index cf841e5..83e63f9 100644 --- a/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/GroovyParserTest.groovy +++ b/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/GroovyParserTest.groovy @@ -462,4 +462,8 @@ final class GroovyParserTest extends GroovyTestCase { void "test groovy core - GROOVY-9507"() { doTest('bugs/BUG-GROOVY-9507.groovy'); } + +void "test groovy core - GROOVY-9522"() { +doTest('bugs/BUG-GROOVY-9522.groovy'); +} } diff --git a/subprojects/parser-antlr4/src/test/resources/bugs/BUG-GROOVY-9522.groovy b/subprojects/parser-antlr4/src/test/resources/bugs/BUG-GROOVY-9522.groovy new file mode 100644 index 000..021d62b --- /dev/null +++ b/subprojects/parser-antlr4/src/test/resources/bugs/BUG-GROOVY-9522.groovy @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + *http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under