You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2019/08/30 20:30:46 UTC

[groovy] branch master updated: Transfer source offsets to tuple wrapper and protect NO_ARGUMENTS

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

emilles pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/master by this push:
     new e75905c  Transfer source offsets to tuple wrapper and protect NO_ARGUMENTS
e75905c is described below

commit e75905c974686ed07936838384af303abbb64f38
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Fri Aug 30 15:08:46 2019 -0500

    Transfer source offsets to tuple wrapper and protect NO_ARGUMENTS
---
 .../groovy/ast/expr/ConstructorCallExpression.java | 34 ++++----
 .../groovy/ast/expr/MethodCallExpression.java      | 94 +++++++++++-----------
 2 files changed, 65 insertions(+), 63 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/expr/ConstructorCallExpression.java b/src/main/java/org/codehaus/groovy/ast/expr/ConstructorCallExpression.java
index cbd5c7b..712c55d 100644
--- a/src/main/java/org/codehaus/groovy/ast/expr/ConstructorCallExpression.java
+++ b/src/main/java/org/codehaus/groovy/ast/expr/ConstructorCallExpression.java
@@ -23,7 +23,7 @@ import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.ast.GroovyCodeVisitor;
 
 /**
- * A constructor call
+ * A constructor call.
  */
 public class ConstructorCallExpression extends Expression implements MethodCall {
 
@@ -31,9 +31,10 @@ public class ConstructorCallExpression extends Expression implements MethodCall
     private boolean usesAnonymousInnerClass;
 
     public ConstructorCallExpression(ClassNode type, Expression arguments) {
-        super.setType(type);
+        setType(type);
         if (!(arguments instanceof TupleExpression)) {
             this.arguments = new TupleExpression(arguments);
+            this.arguments.setSourcePosition(arguments);
         } else {
             this.arguments = arguments;
         }
@@ -44,12 +45,11 @@ public class ConstructorCallExpression extends Expression implements MethodCall
     }
 
     public Expression transformExpression(ExpressionTransformer transformer) {
-        Expression args = transformer.transform(arguments);
-        ConstructorCallExpression ret = new ConstructorCallExpression(getType(), args);
-        ret.setSourcePosition(this);
-        ret.setUsingAnonymousInnerClass(isUsingAnonymousInnerClass());
-        ret.copyNodeMetaData(this);
-        return ret;
+        ConstructorCallExpression answer = new ConstructorCallExpression(getType(), transformer.transform(arguments));
+        answer.setUsingAnonymousInnerClass(isUsingAnonymousInnerClass());
+        answer.setSourcePosition(this);
+        answer.copyNodeMetaData(this);
+        return answer;
     }
 
     public ASTNode getReceiver() {
@@ -65,7 +65,7 @@ public class ConstructorCallExpression extends Expression implements MethodCall
     }
 
     public String getText() {
-        String text = null;
+        String text;
         if (isSuperCall()) {
             text = "super ";
         } else if (isThisCall()) {
@@ -76,27 +76,27 @@ public class ConstructorCallExpression extends Expression implements MethodCall
         return text + arguments.getText();
     }
 
-    public String toString() {
-        return super.toString() + "[type: " + getType() + " arguments: " + arguments + "]";
+    public boolean isSpecialCall() {
+        return isThisCall() || isSuperCall();
     }
 
     public boolean isSuperCall() {
         return getType() == ClassNode.SUPER;
     }
 
-    public boolean isSpecialCall() {
-        return isThisCall() || isSuperCall();
-    }
-
     public boolean isThisCall() {
         return getType() == ClassNode.THIS;
     }
 
+    public boolean isUsingAnonymousInnerClass() {
+        return usesAnonymousInnerClass;
+    }
+
     public void setUsingAnonymousInnerClass(boolean usage) {
         this.usesAnonymousInnerClass = usage;
     }
 
-    public boolean isUsingAnonymousInnerClass() {
-        return usesAnonymousInnerClass;
+    public String toString() {
+        return super.toString() + "[type: " + getType() + " arguments: " + arguments + "]";
     }
 }
diff --git a/src/main/java/org/codehaus/groovy/ast/expr/MethodCallExpression.java b/src/main/java/org/codehaus/groovy/ast/expr/MethodCallExpression.java
index f0250a8..4f8583c 100644
--- a/src/main/java/org/codehaus/groovy/ast/expr/MethodCallExpression.java
+++ b/src/main/java/org/codehaus/groovy/ast/expr/MethodCallExpression.java
@@ -24,44 +24,52 @@ import org.codehaus.groovy.ast.GenericsType;
 import org.codehaus.groovy.ast.GroovyCodeVisitor;
 import org.codehaus.groovy.ast.MethodNode;
 
+import java.util.Collections;
+import java.util.List;
+
 /**
- * A method call on an object or class
+ * A method call on an object or class.
  */
 public class MethodCallExpression extends Expression implements MethodCall {
 
     private Expression objectExpression;
     private Expression method;
     private Expression arguments;
-    private boolean spreadSafe = false;
-    private boolean safe = false;
-    private boolean implicitThis;
+
+    private boolean implicitThis = true;
+    private boolean spreadSafe;
+    private boolean safe;
 
     // type spec for generics
-    private GenericsType[] genericsTypes = null;
-    private boolean usesGenerics = false;
+    private GenericsType[] genericsTypes;
+    private boolean usesGenerics;
 
     private MethodNode target;
 
-    public static final Expression NO_ARGUMENTS = new TupleExpression();
+    public static final Expression NO_ARGUMENTS = new TupleExpression() {
+        @Override
+        public List<Expression> getExpressions() {
+            return Collections.unmodifiableList(super.getExpressions());
+        }
+        @Override
+        public TupleExpression addExpression(Expression e) {
+            throw new UnsupportedOperationException();
+        }
+    };
 
     public MethodCallExpression(Expression objectExpression, String method, Expression arguments) {
-        this(objectExpression,new ConstantExpression(method),arguments);
+        this(objectExpression, new ConstantExpression(method), arguments);
     }
 
     public MethodCallExpression(Expression objectExpression, Expression method, Expression arguments) {
-        this.objectExpression = objectExpression;
-        this.method = method;
-        if (!(arguments instanceof TupleExpression)){
-            this.arguments = new TupleExpression(arguments);
-        } else {
-            this.arguments = arguments;
-        }
-        //TODO: set correct type here
-        // if setting type and a methodcall is the last expression in a method,
+        setMethod(method);
+        setArguments(arguments);
+        setObjectExpression(objectExpression);
+
+        // TODO: set correct type here
+        // if setting type and a MethodCall is the last expression in a method,
         // then the method will return null if the method itself is not void too!
         // (in bytecode after call: aconst_null, areturn)
-        this.setType(ClassHelper.DYNAMIC_TYPE);
-        this.setImplicitThis(true);
     }
 
     public void visit(GroovyCodeVisitor visitor) {
@@ -86,8 +94,9 @@ public class MethodCallExpression extends Expression implements MethodCall {
     }
 
     public void setArguments(Expression arguments) {
-        if (!(arguments instanceof TupleExpression)){
+        if (!(arguments instanceof TupleExpression)) {
             this.arguments = new TupleExpression(arguments);
+            this.arguments.setSourcePosition(arguments);
         } else {
             this.arguments = arguments;
         }
@@ -101,26 +110,26 @@ public class MethodCallExpression extends Expression implements MethodCall {
       this.method = method;
     }
 
-    public ASTNode getReceiver() {
-        return getObjectExpression();
-    }
-
     /**
      * This method returns the method name as String if it is no dynamic
      * calculated method name, but a constant.
      */
     public String getMethodAsString() {
-        if (! (method instanceof ConstantExpression)) return null;
+        if (!(method instanceof ConstantExpression)) return null;
         ConstantExpression constant = (ConstantExpression) method;
         return constant.getText();
     }
 
+    public Expression getObjectExpression() {
+        return objectExpression;
+    }
+
     public void setObjectExpression(Expression objectExpression) {
       this.objectExpression = objectExpression;
     }
 
-    public Expression getObjectExpression() {
-        return objectExpression;
+    public ASTNode getReceiver() {
+        return getObjectExpression();
     }
 
     public String getText() {
@@ -165,17 +174,6 @@ public class MethodCallExpression extends Expression implements MethodCall {
         this.implicitThis = implicitThis;
     }
 
-    public String toString() {
-        return super.toString()
-            + "[object: "
-            + objectExpression
-            + " method: "
-            + method
-            + " arguments: "
-            + arguments
-            + "]";
-    }
-
     public GenericsType[] getGenericsTypes() {
         return genericsTypes;
     }
@@ -190,26 +188,26 @@ public class MethodCallExpression extends Expression implements MethodCall {
     }
 
     /**
+     * @return the target as method node if set
+     */
+    public MethodNode getMethodTarget() {
+        return target;
+    }
+
+    /**
      * Sets a method call target for a direct method call.
      * WARNING: A method call made this way will run outside of the MOP!
      * @param mn the target as MethodNode, mn==null means no target
      */
     public void setMethodTarget(MethodNode mn) {
         this.target = mn;
-        if (mn!=null) {
+        if (mn != null) {
             setType(target.getReturnType());
         } else {
             setType(ClassHelper.OBJECT_TYPE);
         }
     }
 
-    /**
-     * @return the target as method node if set
-     */
-    public MethodNode getMethodTarget() {
-        return target;
-    }
-
     @Override
     public void setSourcePosition(ASTNode node) {
         super.setSourcePosition(node);
@@ -230,4 +228,8 @@ public class MethodCallExpression extends Expression implements MethodCall {
             method.setSourcePosition(((PropertyExpression) node).getProperty());
         }
     }
+
+    public String toString() {
+        return super.toString() + "[object: " + objectExpression + " method: " + method + " arguments: " + arguments + "]";
+    }
 }