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());