Repository: groovy
Updated Branches:
  refs/heads/parrot 2f406901c -> 68c8c5f45


Check duplicated modifiers


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/68c8c5f4
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/68c8c5f4
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/68c8c5f4

Branch: refs/heads/parrot
Commit: 68c8c5f45fd0ddf9594941232ab2d7a35c74e619
Parents: 2f40690
Author: sunlan <sun...@apache.org>
Authored: Fri Jan 13 20:47:57 2017 +0800
Committer: sunlan <sun...@apache.org>
Committed: Fri Jan 13 20:47:57 2017 +0800

----------------------------------------------------------------------
 .../apache/groovy/parser/antlr4/AstBuilder.java | 227 ++-----------------
 .../groovy/parser/antlr4/SyntaxErrorTest.groovy |   6 +
 .../src/test/resources/fail/Modifier_01x.groovy |   1 +
 .../src/test/resources/fail/Modifier_02x.groovy |   1 +
 .../src/test/resources/fail/Modifier_03x.groovy |   1 +
 5 files changed, 32 insertions(+), 204 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/68c8c5f4/subprojects/groovy-parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
----------------------------------------------------------------------
diff --git 
a/subprojects/groovy-parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
 
b/subprojects/groovy-parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
index 3f78bbf..9645000 100644
--- 
a/subprojects/groovy-parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
+++ 
b/subprojects/groovy-parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
@@ -140,209 +140,7 @@ import java.util.logging.Logger;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import static org.apache.groovy.parser.antlr4.GroovyLangParser.ABSTRACT;
-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.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.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.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.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.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.EnhancedArgumentListContext;
-import static 
org.apache.groovy.parser.antlr4.GroovyLangParser.EnhancedArgumentListElementContext;
-import static 
org.apache.groovy.parser.antlr4.GroovyLangParser.EnhancedForControlContext;
-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.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.FINAL;
-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.IfElseStmtAltContext;
-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.LastFormalParameterContext;
-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.NATIVE;
-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.NlsContext;
-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.PROTECTED;
-import static org.apache.groovy.parser.antlr4.GroovyLangParser.PUBLIC;
-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.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.STRICTFP;
-import static org.apache.groovy.parser.antlr4.GroovyLangParser.SUB;
-import static org.apache.groovy.parser.antlr4.GroovyLangParser.SYNCHRONIZED;
-import static org.apache.groovy.parser.antlr4.GroovyLangParser.SepContext;
-import static 
org.apache.groovy.parser.antlr4.GroovyLangParser.ShiftExprAltContext;
-import static 
org.apache.groovy.parser.antlr4.GroovyLangParser.StandardLambdaContext;
-import static 
org.apache.groovy.parser.antlr4.GroovyLangParser.StandardLambdaParametersContext;
-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.SwitchStmtAltContext;
-import static 
org.apache.groovy.parser.antlr4.GroovyLangParser.SynchronizedStmtAltContext;
-import static org.apache.groovy.parser.antlr4.GroovyLangParser.TRANSIENT;
-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.VOLATILE;
-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.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.GroovyLangParser.*;
 import static 
org.apache.groovy.parser.antlr4.GroovyParser.ElementValuesContext;
 import static org.codehaus.groovy.runtime.DefaultGroovyMethods.asBoolean;
 import static org.codehaus.groovy.runtime.DefaultGroovyMethods.last;
@@ -4363,13 +4161,28 @@ public class AstBuilder extends 
GroovyParserBaseVisitor<Object> implements Groov
      * <p>
      * Created by Daniel.Sun on 2016/08/27.
      */
-    private static class ModifierManager {
+    private class ModifierManager {
         private List<ModifierNode> modifierNodeList;
 
         public ModifierManager(List<ModifierNode> modifierNodeList) {
+            this.checkDuplicatedModifiers(modifierNodeList);
             this.modifierNodeList = 
Collections.unmodifiableList(asBoolean((Object) modifierNodeList) ? 
modifierNodeList : Collections.emptyList());
         }
 
+        public void checkDuplicatedModifiers(List<ModifierNode> 
modifierNodeList) {
+            Map<ModifierNode, Integer> modifierNodeCounter = new 
HashMap<>(modifierNodeList.size());
+
+            for (ModifierNode modifierNode : modifierNodeList) {
+               Integer cnt = modifierNodeCounter.get(modifierNode);
+
+               if (null == cnt) {
+                   modifierNodeCounter.put(modifierNode, 1);
+               } else if (1 == cnt && !modifierNode.isRepeatable()) {
+                   throw createParsingFailedException(modifierNode.getText() + 
" can not be duplicated", modifierNode);
+               }
+            }
+        }
+
         // t    1: class modifiers value; 2: class member modifiers value
         private int calcModifiersOpValue(int t) {
             int result = 0;
@@ -4471,6 +4284,7 @@ public class AstBuilder extends 
GroovyParserBaseVisitor<Object> implements Groov
         private Integer opCode; // ASM opcode
         private String text;
         private AnnotationNode annotationNode;
+        private boolean repeatable;
 
         public static final int ANNOTATION_TYPE = -999;
         private static final Map<Integer, Integer> MAP = new HashMap<Integer, 
Integer>() {
@@ -4497,6 +4311,7 @@ public class AstBuilder extends 
GroovyParserBaseVisitor<Object> implements Groov
         public ModifierNode(Integer type) {
             this.type = type;
             this.opCode = MAP.get(type);
+            this.repeatable = ANNOTATION_TYPE == type; // Only annotations are 
repeatable
 
             if (!asBoolean((Object) this.opCode)) {
                 throw new IllegalArgumentException("Unsupported modifier type: 
" + type);
@@ -4558,6 +4373,10 @@ public class AstBuilder extends 
GroovyParserBaseVisitor<Object> implements Groov
             return opCode;
         }
 
+        public boolean isRepeatable() {
+            return repeatable;
+        }
+
         @Override
         public String getText() {
             return text;

http://git-wip-us.apache.org/repos/asf/groovy/blob/68c8c5f4/subprojects/groovy-parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/SyntaxErrorTest.groovy
----------------------------------------------------------------------
diff --git 
a/subprojects/groovy-parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/SyntaxErrorTest.groovy
 
b/subprojects/groovy-parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/SyntaxErrorTest.groovy
index bc9a6e1..680f146 100644
--- 
a/subprojects/groovy-parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/SyntaxErrorTest.groovy
+++ 
b/subprojects/groovy-parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/SyntaxErrorTest.groovy
@@ -125,6 +125,12 @@ class SyntaxErrorTest extends GroovyTestCase {
         TestUtils.doRunAndShouldFail('fail/DoWhile_01x.groovy');
     }
 
+    void "test groovy core - Modifier"() {
+        TestUtils.doRunAndShouldFail('fail/Modifier_01x.groovy');
+        TestUtils.doRunAndShouldFail('fail/Modifier_02x.groovy');
+        TestUtils.doRunAndShouldFail('fail/Modifier_03x.groovy');
+    }
+
     /**************************************/
     static unzipScriptAndShouldFail(String entryName, List ignoreClazzList, 
Map<String, String> replacementsMap=[:], boolean toCheckNewParserOnly = false) {
         ignoreClazzList.addAll(COMMON_IGNORE_CLASS_LIST)

http://git-wip-us.apache.org/repos/asf/groovy/blob/68c8c5f4/subprojects/groovy-parser-antlr4/src/test/resources/fail/Modifier_01x.groovy
----------------------------------------------------------------------
diff --git 
a/subprojects/groovy-parser-antlr4/src/test/resources/fail/Modifier_01x.groovy 
b/subprojects/groovy-parser-antlr4/src/test/resources/fail/Modifier_01x.groovy
new file mode 100644
index 0000000..3a42c5c
--- /dev/null
+++ 
b/subprojects/groovy-parser-antlr4/src/test/resources/fail/Modifier_01x.groovy
@@ -0,0 +1 @@
+def def m() {}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/groovy/blob/68c8c5f4/subprojects/groovy-parser-antlr4/src/test/resources/fail/Modifier_02x.groovy
----------------------------------------------------------------------
diff --git 
a/subprojects/groovy-parser-antlr4/src/test/resources/fail/Modifier_02x.groovy 
b/subprojects/groovy-parser-antlr4/src/test/resources/fail/Modifier_02x.groovy
new file mode 100644
index 0000000..df8b840
--- /dev/null
+++ 
b/subprojects/groovy-parser-antlr4/src/test/resources/fail/Modifier_02x.groovy
@@ -0,0 +1 @@
+public public class A {}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/groovy/blob/68c8c5f4/subprojects/groovy-parser-antlr4/src/test/resources/fail/Modifier_03x.groovy
----------------------------------------------------------------------
diff --git 
a/subprojects/groovy-parser-antlr4/src/test/resources/fail/Modifier_03x.groovy 
b/subprojects/groovy-parser-antlr4/src/test/resources/fail/Modifier_03x.groovy
new file mode 100644
index 0000000..9f2c1b8
--- /dev/null
+++ 
b/subprojects/groovy-parser-antlr4/src/test/resources/fail/Modifier_03x.groovy
@@ -0,0 +1 @@
+final final int a = 1;
\ No newline at end of file

Reply via email to