Repository: groovy Updated Branches: refs/heads/master d2706f74b -> c21ff85c4
Minor refactoring: refine validation for better performance Project: http://git-wip-us.apache.org/repos/asf/groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/c21ff85c Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/c21ff85c Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/c21ff85c Branch: refs/heads/master Commit: c21ff85c4f1277297577b0dd5e1af6174b23c072 Parents: d2706f7 Author: sunlan <sun...@apache.org> Authored: Thu Jan 25 22:10:49 2018 +0800 Committer: sunlan <sun...@apache.org> Committed: Thu Jan 25 22:11:02 2018 +0800 ---------------------------------------------------------------------- src/antlr/GroovyParser.g4 | 44 ---- .../apache/groovy/parser/antlr4/AstBuilder.java | 256 ++++++++++++++++++- 2 files changed, 248 insertions(+), 52 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/groovy/blob/c21ff85c/src/antlr/GroovyParser.g4 ---------------------------------------------------------------------- diff --git a/src/antlr/GroovyParser.g4 b/src/antlr/GroovyParser.g4 index 3da2dab..2db4c7f 100644 --- a/src/antlr/GroovyParser.g4 +++ b/src/antlr/GroovyParser.g4 @@ -504,7 +504,6 @@ lambdaBody // CLOSURE closure -locals[ String footprint = "" ] : LBRACE nls (formalParameterList? nls ARROW nls)? blockStatementsOpt RBRACE ; @@ -615,48 +614,22 @@ ifElseStatement ; switchStatement -locals[ String footprint = "" ] : SWITCH expressionInPar nls LBRACE nls switchBlockStatementGroup* nls RBRACE ; loopStatement -locals[ String footprint = "" ] : FOR LPAREN forControl rparen nls statement #forStmtAlt | WHILE expressionInPar nls statement #whileStmtAlt | DO nls statement nls WHILE expressionInPar #doWhileStmtAlt ; continueStatement -locals[ boolean isInsideLoop ] -@init { - try { - $isInsideLoop = null != $loopStatement::footprint; - } catch(NullPointerException e) { - $isInsideLoop = false; - } -} : CONTINUE - { require($isInsideLoop, "the continue statement is only allowed inside loops", -8); } identifier? ; breakStatement -locals[ boolean isInsideLoop, boolean isInsideSwitch ] -@init { - try { - $isInsideLoop = null != $loopStatement::footprint; - } catch(NullPointerException e) { - $isInsideLoop = false; - } - - try { - $isInsideSwitch = null != $switchStatement::footprint; - } catch(NullPointerException e) { - $isInsideSwitch = false; - } -} : BREAK - { require($isInsideLoop || $isInsideSwitch, "the break statement is only allowed inside loops or switches", -5); } identifier? ; @@ -667,7 +640,6 @@ tryCatchStatement ; assertStatement -locals[ String footprint = "" ] : ASSERT ce=expression (nls (COLON | COMMA) nls me=expression)? ; @@ -805,14 +777,6 @@ statementExpression ; postfixExpression -locals[ boolean isInsideAssert ] -@init { - try { - $isInsideAssert = null != $assertStatement::footprint; - } catch(NullPointerException e) { - $isInsideAssert = false; - } -} : pathExpression op=(INC | DEC)? ; @@ -966,14 +930,6 @@ pathExpression returns [int t] ; pathElement returns [int t] -locals[ boolean isInsideClosure ] -@init { - try { - $isInsideClosure = null != $closure::footprint; - } catch(NullPointerException e) { - $isInsideClosure = false; - } -} : nls // AT: foo.@bar selects the field (or attribute), not property http://git-wip-us.apache.org/repos/asf/groovy/blob/c21ff85c/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java ---------------------------------------------------------------------- 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 675255b..e1bed5d 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 @@ -137,7 +137,212 @@ import java.util.logging.Logger; import java.util.stream.Collectors; import java.util.stream.Stream; -import static org.apache.groovy.parser.antlr4.GroovyLangParser.*; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ADD; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.AS; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.AdditiveExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.AndExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.AnnotatedQualifiedClassNameContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.AnnotationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.AnnotationNameContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.AnnotationsOptContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.AnonymousInnerClassDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ArgumentsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ArrayInitializerContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.AssertStatementContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.AssertStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.AssignmentExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.BlockContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.BlockStatementContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.BlockStatementsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.BlockStatementsOptContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.BooleanLiteralAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.BreakStatementContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.BreakStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.BuiltInTypeContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CASE; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CastExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CastParExpressionContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CatchClauseContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CatchTypeContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClassBodyContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClassBodyDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClassDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClassNameContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClassOrInterfaceModifierContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClassOrInterfaceModifiersContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClassOrInterfaceModifiersOptContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClassOrInterfaceTypeContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClassicalForControlContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClassifiedModifiersContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClosureContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClosurePrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CommandArgumentContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CommandExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CommandExpressionContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CompilationUnitContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ConditionalExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ConditionalStatementContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ConditionalStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ContinueStatementContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ContinueStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CreatedNameContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CreatorContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.DEC; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.DEF; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.DEFAULT; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.DimsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.DimsOptContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.DoWhileStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.DynamicMemberNameContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ElementValueArrayInitializerContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ElementValueContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ElementValuePairContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ElementValuePairsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ElementValuesContext; +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.EnhancedExpressionContext; +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; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.EnumConstantsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.EqualityExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ExclusiveOrExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ExpressionContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ExpressionInParContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ExpressionListContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ExpressionListElementContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ExpressionStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.FieldDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.FinallyBlockContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.FloatingPointLiteralAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ForControlContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ForInitContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ForStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ForUpdateContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.FormalParameterContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.FormalParameterListContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.FormalParametersContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.GE; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.GT; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.GroovyParserRuleContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.GstringContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.GstringPathContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.GstringPrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.GstringValueContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.IN; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.INC; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.INSTANCEOF; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.IdentifierContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.IdentifierPrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.IfElseStatementContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ImportDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ImportStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.InclusiveOrExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.IndexPropertyArgsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.IntegerLiteralAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.KeywordsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LE; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LT; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LabeledStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LambdaBodyContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LambdaPrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ListContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ListPrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LiteralPrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LocalVariableDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LocalVariableDeclarationStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LogicalAndExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LogicalOrExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LoopStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MapContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MapEntryContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MapEntryLabelContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MapEntryListContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MapPrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MemberDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MethodBodyContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MethodDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MethodDeclarationStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MethodNameContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ModifierContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ModifiersContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ModifiersOptContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MultipleAssignmentExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MultiplicativeExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.NOT_IN; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.NOT_INSTANCEOF; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.NamePartContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.NamedPropertyArgsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.NewPrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.NonWildcardTypeArgumentsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.NormalExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.NullLiteralAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.PRIVATE; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.PackageDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ParExpressionContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ParenPrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.PathElementContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.PathExpressionContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.PostfixExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.PostfixExpressionContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.PowerExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.PrimitiveTypeContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.QualifiedClassNameContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.QualifiedClassNameListContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.QualifiedNameContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.QualifiedStandardClassNameContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.RegexExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.RelationalExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ResourceContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ResourceListContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ResourcesContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ReturnStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ReturnTypeContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.STATIC; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.SUB; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ShiftExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.StandardLambdaExpressionContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.StandardLambdaParametersContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.StatementsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.StringLiteralAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.StringLiteralContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.SuperPrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.SwitchBlockStatementGroupContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.SwitchLabelContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.SwitchStatementContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.SynchronizedStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ThisFormalParameterContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ThisPrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ThrowStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TryCatchStatementContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TryCatchStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeArgumentContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeArgumentsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeArgumentsOrDiamondContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeBoundContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeDeclarationStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeListContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeNamePairContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeNamePairsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeParameterContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeParametersContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypePrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.UnaryAddExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.UnaryNotExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.VariableDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.VariableDeclaratorContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.VariableDeclaratorIdContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.VariableDeclaratorsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.VariableInitializerContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.VariableInitializersContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.VariableModifierContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.VariableModifiersContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.VariableModifiersOptContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.VariableNamesContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.WhileStmtAltContext; import static org.apache.groovy.parser.antlr4.util.PositionConfigureUtils.configureAST; import static org.codehaus.groovy.runtime.DefaultGroovyMethods.asBoolean; import static org.codehaus.groovy.runtime.DefaultGroovyMethods.last; @@ -362,8 +567,11 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov } // statement { -------------------------------------------------------------------- + @Override public AssertStatement visitAssertStatement(AssertStatementContext ctx) { + visitingAssertStatementCnt++; + Expression conditionExpression = (Expression) this.visit(ctx.ce); if (conditionExpression instanceof BinaryExpression) { @@ -383,9 +591,13 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov new AssertStatement(booleanExpression), ctx); } - return configureAST(new AssertStatement(booleanExpression, + AssertStatement result = configureAST(new AssertStatement(booleanExpression, (Expression) this.visit(ctx.me)), ctx); + + visitingAssertStatementCnt--; + + return result; } @Override @@ -428,10 +640,13 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov return configureAST(new IfStatement(booleanExpression, ifBlock, elseBlock), ctx); } - @Override public Statement visitLoopStmtAlt(LoopStmtAltContext ctx) { - return configureAST((Statement) this.visit(ctx.loopStatement()), ctx); + visitingLoopStatementCnt++; + Statement result = configureAST((Statement) this.visit(ctx.loopStatement()), ctx); + visitingLoopStatementCnt--; + + return result; } @Override @@ -687,8 +902,12 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov ctx); } + + @Override public SwitchStatement visitSwitchStatement(SwitchStatementContext ctx) { + visitingSwitchStatementCnt++; + List<Statement> statementList = ctx.switchBlockStatementGroup().stream() .map(this::visitSwitchBlockStatementGroup) @@ -717,7 +936,7 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov throw createParsingFailedException("default case should appear at last", defaultStatementList.get(0)); } - return configureAST( + SwitchStatement result = configureAST( new SwitchStatement( this.visitExpressionInPar(ctx.expressionInPar()), caseStatementList, @@ -725,6 +944,9 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov ), ctx); + visitingSwitchStatementCnt--; + + return result; } @@ -829,6 +1051,10 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov @Override public BreakStatement visitBreakStatement(BreakStatementContext ctx) { + if (0 == visitingLoopStatementCnt && 0 == visitingSwitchStatementCnt) { + throw createParsingFailedException("break statement is only allowed inside loops or switches", ctx); + } + String label = asBoolean(ctx.identifier()) ? this.visitIdentifier(ctx.identifier()) : null; @@ -843,6 +1069,10 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov @Override public ContinueStatement visitContinueStatement(ContinueStatementContext ctx) { + if (0 == visitingLoopStatementCnt) { + throw createParsingFailedException("continue statement is only allowed inside loops", ctx); + } + String label = asBoolean(ctx.identifier()) ? this.visitIdentifier(ctx.identifier()) : null; @@ -2137,7 +2367,7 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov // so if this and super is inside the closure, it will not be constructor call. // e.g. src/test/org/codehaus/groovy/transform/MapConstructorTransformTest.groovy: // @MapConstructor(pre={ super(args?.first, args?.last); args = args ?: [:] }, post = { first = first?.toUpperCase() }) - if (ctx.isInsideClosure) { + if (visitingClosureCnt > 0) { return configureAST( new MethodCallExpression( baseExpr, @@ -2514,7 +2744,7 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov if (asBoolean(ctx.op)) { PostfixExpression postfixExpression = new PostfixExpression(pathExpr, createGroovyToken(ctx.op)); - if (ctx.isInsideAssert) { + if (visitingAssertStatementCnt > 0) { // powerassert requires different column for values, so we have to copy the location of op return configureAST(postfixExpression, ctx.op); } else { @@ -3421,6 +3651,8 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov @Override public ClosureExpression visitClosure(ClosureContext ctx) { + visitingClosureCnt++; + Parameter[] parameters = asBoolean(ctx.formalParameterList()) ? this.visitFormalParameterList(ctx.formalParameterList()) : null; @@ -3430,8 +3662,11 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov } Statement code = this.visitBlockStatementsOpt(ctx.blockStatementsOpt()); + ClosureExpression result = configureAST(new ClosureExpression(parameters, code), ctx); + + visitingClosureCnt--; - return configureAST(new ClosureExpression(parameters, code), ctx); + return result; } @Override @@ -4451,6 +4686,11 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov private Tuple2<GroovyParserRuleContext, Exception> numberFormatError; + private int visitingLoopStatementCnt; + private int visitingSwitchStatementCnt; + private int visitingAssertStatementCnt; + private int visitingClosureCnt; + private static final String QUESTION_STR = "?"; private static final String DOT_STR = "."; private static final String SUB_STR = "-";