You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2017/09/30 15:33:42 UTC

groovy git commit: Minor refactoring: methodDeclaration

Repository: groovy
Updated Branches:
  refs/heads/master cbb9a6be1 -> f4b8989f7


Minor refactoring: methodDeclaration


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

Branch: refs/heads/master
Commit: f4b8989f74d3fb874802b019ff2ad40c2986c1a5
Parents: cbb9a6b
Author: sunlan <su...@apache.org>
Authored: Sat Sep 30 23:33:28 2017 +0800
Committer: sunlan <su...@apache.org>
Committed: Sat Sep 30 23:33:28 2017 +0800

----------------------------------------------------------------------
 src/antlr/GroovyParser.g4                       | 14 ++---------
 .../apache/groovy/parser/antlr4/AstBuilder.java | 26 +++++++++++++++++---
 2 files changed, 25 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/f4b8989f/src/antlr/GroovyParser.g4
----------------------------------------------------------------------
diff --git a/src/antlr/GroovyParser.g4 b/src/antlr/GroovyParser.g4
index f2098e3..a094f76 100644
--- a/src/antlr/GroovyParser.g4
+++ b/src/antlr/GroovyParser.g4
@@ -282,19 +282,9 @@ methodDeclaration[int t, int ct]
     :   { 3 == $ct }?
         returnType[$ct] methodName LPAREN RPAREN (DEFAULT nls elementValue)?
     |
-        (   { 0 == $t }?
-            modifiersOpt typeParameters?
-        |   modifiersOpt  typeParameters? returnType[$ct]
-        |   modifiers  typeParameters? returnType[$ct]?
-        )
+        modifiersOpt typeParameters? returnType[$ct]?
         methodName formalParameters (nls THROWS nls qualifiedClassNameList)?
-        (
-            { 0 == $t || 3 == $t || 1 == $t}?
-            nls methodBody
-        |
-            { 0 == $t || 3 == $t || 2 == $t }?
-            /* no method body */
-        )
+        nls methodBody?
     ;
 
 methodName

http://git-wip-us.apache.org/repos/asf/groovy/blob/f4b8989f/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 dfa370f..d18fd2c 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
@@ -1266,9 +1266,7 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov
     private ModifierManager createModifierManager(MethodDeclarationContext ctx) {
         List<ModifierNode> modifierNodeList = Collections.emptyList();
 
-        if (asBoolean(ctx.modifiers())) {
-            modifierNodeList = this.visitModifiers(ctx.modifiers());
-        } else if (asBoolean(ctx.modifiersOpt())) {
+        if (asBoolean(ctx.modifiersOpt())) {
             modifierNodeList = this.visitModifiersOpt(ctx.modifiersOpt());
         }
 
@@ -1289,6 +1287,8 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov
 
     @Override
     public MethodNode visitMethodDeclaration(MethodDeclarationContext ctx) {
+        validateMethodDeclaration(ctx);
+
         ModifierManager modifierManager = createModifierManager(ctx);
         String methodName = this.visitMethodName(ctx.methodName());
         ClassNode returnType = this.visitReturnType(ctx.returnType());
@@ -1336,6 +1336,26 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov
         return methodNode;
     }
 
+    private void validateMethodDeclaration(MethodDeclarationContext ctx) {
+        if (1 == ctx.t || 2 == ctx.t || 3 == ctx.t) { // 1: normal method declaration; 2: abstract method declaration; 3: normal method declaration OR abstract method declaration
+            if (!(asBoolean(ctx.modifiersOpt().modifiers()) || asBoolean(ctx.returnType()))) {
+                throw createParsingFailedException("Modifiers or return type is required", ctx);
+            }
+        }
+
+        if (1 == ctx.t) {
+            if (!asBoolean(ctx.methodBody())) {
+                throw createParsingFailedException("Method body is required", ctx);
+            }
+        }
+
+        if (2 == ctx.t) {
+            if (asBoolean(ctx.methodBody())) {
+                throw createParsingFailedException("Abstract method should not have method body", ctx);
+            }
+        }
+    }
+
     private void validateMethodDeclaration(MethodDeclarationContext ctx, MethodNode methodNode, ModifierManager modifierManager, ClassNode classNode) {
         boolean isAbstractMethod = methodNode.isAbstract();
         boolean hasMethodBody = asBoolean(methodNode.getCode());