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 2020/06/26 02:54:53 UTC

[groovy] branch danielsun/tweak-statement-rule updated: Trivial refactoring

This is an automated email from the ASF dual-hosted git repository.

sunlan pushed a commit to branch danielsun/tweak-statement-rule
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/danielsun/tweak-statement-rule by this push:
     new 59b59ec  Trivial refactoring
59b59ec is described below

commit 59b59ecec1be31d4ce177901c6f0db67f775337f
Author: Daniel Sun <su...@apache.org>
AuthorDate: Fri Jun 26 10:54:26 2020 +0800

    Trivial refactoring
---
 .../apache/groovy/parser/antlr4/AstBuilder.java    | 66 ++++++++++++++--------
 1 file changed, 43 insertions(+), 23 deletions(-)

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 4e11861..6ce6000 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
@@ -113,6 +113,7 @@ import org.codehaus.groovy.ast.stmt.SynchronizedStatement;
 import org.codehaus.groovy.ast.stmt.ThrowStatement;
 import org.codehaus.groovy.ast.stmt.TryCatchStatement;
 import org.codehaus.groovy.ast.stmt.WhileStatement;
+import org.codehaus.groovy.ast.tools.ClosureUtils;
 import org.codehaus.groovy.control.CompilationFailedException;
 import org.codehaus.groovy.control.CompilePhase;
 import org.codehaus.groovy.control.SourceUnit;
@@ -2067,29 +2068,7 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> {
                             || baseExpr instanceof GStringExpression /* e.g. "$m" 1, 2 */
                             || (baseExpr instanceof ConstantExpression && isTrue(baseExpr, IS_STRING)) /* e.g. "m" 1, 2 */)
             ) {
-                if (baseExpr instanceof VariableExpression) {
-                    /* Validate the following invalid cases:
-                     *  1) void m() {}
-                     *  2) String m() {}
-                     *  Note: if the text of `VariableExpression` does not start with upper case character, e.g. task m() {}
-                     *        ,it may be a command expression
-                     */
-                    if (isBuiltInType(baseExpr) || Character.isUpperCase(baseExpr.getText().codePointAt(0))) {
-                        if (arguments instanceof ArgumentListExpression) {
-                            List<Expression> expressionList = ((ArgumentListExpression) arguments).getExpressions();
-                            if (1 == expressionList.size()) {
-                                final Expression expression = expressionList.get(0);
-                                if (expression instanceof MethodCallExpression) {
-                                    throw createParsingFailedException(
-                                            "Method definition not expected here",
-                                            tuple(baseExpr.getLineNumber(), baseExpr.getColumnNumber()),
-                                            tuple(expression.getLastLineNumber(), expression.getLastColumnNumber())
-                                    );
-                                }
-                            }
-                        }
-                    }
-                }
+                validateInvalidMethodDefinition(baseExpr, arguments);
 
                 methodCallExpression =
                         configureAST(
@@ -2124,6 +2103,47 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> {
                 ctx);
     }
 
+    /* Validate the following invalid cases:
+     *  1) void m() {}
+     *  2) String m() {}
+     *  Note: if the text of `VariableExpression` does not start with upper case character, e.g. task m() {}
+     *        ,it may be a command expression
+     */
+    private void validateInvalidMethodDefinition(Expression baseExpr, Expression arguments) {
+        if (baseExpr instanceof VariableExpression) {
+            if (isBuiltInType(baseExpr) || Character.isUpperCase(baseExpr.getText().codePointAt(0))) {
+                if (arguments instanceof ArgumentListExpression) {
+                    List<Expression> expressionList = ((ArgumentListExpression) arguments).getExpressions();
+                    if (1 == expressionList.size()) {
+                        final Expression expression = expressionList.get(0);
+                        if (expression instanceof MethodCallExpression) {
+                            MethodCallExpression mce = (MethodCallExpression) expression;
+                            final Expression methodCallArguments = mce.getArguments();
+
+                            // check the method call tails with a closure
+                            if (methodCallArguments instanceof ArgumentListExpression) {
+                                List<Expression> methodCallArgumentExpressionList = ((ArgumentListExpression) methodCallArguments).getExpressions();
+                                final int argumentCnt = methodCallArgumentExpressionList.size();
+                                if (argumentCnt > 0) {
+                                    final Expression lastArgumentExpression = methodCallArgumentExpressionList.get(argumentCnt - 1);
+                                    if (lastArgumentExpression instanceof ClosureExpression) {
+                                        if (ClosureUtils.hasImplicitParameter(((ClosureExpression) lastArgumentExpression))) {
+                                            throw createParsingFailedException(
+                                                    "Method definition not expected here",
+                                                    tuple(baseExpr.getLineNumber(), baseExpr.getColumnNumber()),
+                                                    tuple(expression.getLastLineNumber(), expression.getLastColumnNumber())
+                                            );
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
     @Override
     public Expression visitCommandArgument(CommandArgumentContext ctx) {
         // e.g. x y a b     we call "x y" as the base expression