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 4e7cd375ba defer `dynamicType()` usage
4e7cd375ba is described below

commit 4e7cd375ba48583654d73fdfe7da3b3f3fd72999
Author: Eric Milles <[email protected]>
AuthorDate: Sun Aug 13 16:10:57 2023 -0500

    defer `dynamicType()` usage
---
 .../org/codehaus/groovy/ast/expr/Expression.java   | 66 +++++++++++++---------
 .../codehaus/groovy/ast/expr/FieldExpression.java  |  1 -
 2 files changed, 38 insertions(+), 29 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/expr/Expression.java 
b/src/main/java/org/codehaus/groovy/ast/expr/Expression.java
index b415bb6bfe..946025a47a 100644
--- a/src/main/java/org/codehaus/groovy/ast/expr/Expression.java
+++ b/src/main/java/org/codehaus/groovy/ast/expr/Expression.java
@@ -20,60 +20,70 @@ package org.codehaus.groovy.ast.expr;
 
 import org.codehaus.groovy.GroovyBugError;
 import org.codehaus.groovy.ast.AnnotatedNode;
-import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.ClassNode;
 
 import java.util.ArrayList;
 import java.util.List;
 
+import static org.codehaus.groovy.ast.ClassHelper.dynamicType;
+import static org.codehaus.groovy.ast.ClassHelper.make;
+
 /**
- * Represents a base class for expressions which evaluate as an object
+ * Base class for any expression.
  */
 public abstract class Expression extends AnnotatedNode {
+
     public static final Expression[] EMPTY_ARRAY = new Expression[0];
-    private ClassNode type = ClassHelper.dynamicType();
+
+    private static final ClassNode NULL_TYPE = make("null");
+
+    private ClassNode type = NULL_TYPE;
+
+    public ClassNode getType() {
+        if (type == NULL_TYPE) {
+            type = dynamicType();
+        }
+        return type;
+    }
+
+    public void setType(ClassNode type) {
+        this.type = type;
+    }
 
     /**
-     * Return a copy of the expression calling the transformer on any nested 
expressions 
-     * @param transformer
+     * Transforms this expression and any nested expressions.
      */
     public abstract Expression transformExpression(ExpressionTransformer 
transformer);
 
     /**
-     * Transforms the list of expressions
+     * Transforms list of expressions.
+     *
      * @return a new list of transformed expressions
      */
     protected List<Expression> transformExpressions(List<? extends Expression> 
expressions, ExpressionTransformer transformer) {
-        List<Expression> list = new ArrayList<Expression>(expressions.size());
-        for (Expression expr : expressions ) {
-            list.add(transformer.transform(expr));
+        List<Expression> list = new ArrayList<>(expressions.size());
+        for (Expression expression : expressions) {
+            expression = transformer.transform(expression);
+            list.add(expression);
         }
         return list;
     }
 
     /**
-     * Transforms the list of expressions, and checks that all transformed 
expressions have the given type.
+     * Transforms list of expressions and checks that all transformed 
expressions have the given type.
      *
-     * @return a new list of transformed expressions
+     * @return a new type-safe list of transformed expressions
      */
-    protected <T extends Expression> List<T> transformExpressions(List<? 
extends Expression> expressions,
-            ExpressionTransformer transformer, Class<T> transformedType) {
-        List<T> list = new ArrayList<T>(expressions.size());
-        for (Expression expr : expressions) {
-            Expression transformed = transformer.transform(expr);
-            if (!transformedType.isInstance(transformed))
-                throw new GroovyBugError(String.format("Transformed expression 
should have type %s but has type %s",
-                    transformedType, transformed.getClass()));
-            list.add(transformedType.cast(transformed));
+    protected <T extends Expression> List<T> transformExpressions(List<? 
extends Expression> expressions, ExpressionTransformer transformer, Class<T> 
targetType) {
+        List<T> list = new ArrayList<>(expressions.size());
+        for (Expression expression : expressions) {
+            expression = transformer.transform(expression);
+            if (!targetType.isInstance(expression)) {
+                throw new GroovyBugError("Transformed expression should have 
type " +
+                    targetType.getName() + " but has type " + 
expression.getClass().getName());
+            }
+            list.add(targetType.cast(expression));
         }
         return list;
     }
-
-    public ClassNode getType() {
-        return type;
-    }
-
-    public void setType(ClassNode t) {
-        type=t;
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/ast/expr/FieldExpression.java 
b/src/main/java/org/codehaus/groovy/ast/expr/FieldExpression.java
index 78a4c028a3..8e7669bb9f 100644
--- a/src/main/java/org/codehaus/groovy/ast/expr/FieldExpression.java
+++ b/src/main/java/org/codehaus/groovy/ast/expr/FieldExpression.java
@@ -66,7 +66,6 @@ public class FieldExpression extends Expression {
 
     @Override
     public void setType(final ClassNode type) {
-        super.setType(type);
         field.setType(type);
     }
 

Reply via email to