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