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 2020/09/28 02:19:09 UTC
[groovy] 02/02: repair and reuse TypeCheckingExtension#buildListType
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
commit 3cae41ea52e9cd62fce21b50c2c84e4a159da5cc
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sun Sep 27 21:11:04 2020 -0500
repair and reuse TypeCheckingExtension#buildListType
---
.../transform/stc/StaticTypeCheckingVisitor.java | 25 ++++++----------------
.../transform/stc/TypeCheckingExtension.java | 25 ++++++++++++----------
2 files changed, 20 insertions(+), 30 deletions(-)
diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index 0cdb70b..8b068bd 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -1142,15 +1142,12 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
return null;
}
- private static ClassNode adjustTypeForSpreading(final ClassNode inferredRightExpressionType, final Expression leftExpression) {
+ private ClassNode adjustTypeForSpreading(final ClassNode inferredRightExpressionType, final Expression leftExpression) {
// imagine we have: list*.foo = 100
// then the assignment must be checked against [100], not 100
ClassNode wrappedRHS = inferredRightExpressionType;
if (leftExpression instanceof PropertyExpression && ((PropertyExpression) leftExpression).isSpreadSafe()) {
- wrappedRHS = LIST_TYPE.getPlainNodeReference();
- wrappedRHS.setGenericsTypes(new GenericsType[]{
- new GenericsType(getWrapper(inferredRightExpressionType))
- });
+ wrappedRHS = extension.buildListType(inferredRightExpressionType);
}
return wrappedRHS;
}
@@ -1679,9 +1676,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
PropertyExpression subExp = new PropertyExpression(varX("{}", contentType), pexp.getPropertyAsString());
AtomicReference<ClassNode> result = new AtomicReference<>();
if (existsProperty(subExp, true, new PropertyLookupVisitor(result))) {
- ClassNode intf = LIST_TYPE.getPlainNodeReference();
- intf.setGenericsTypes(new GenericsType[]{new GenericsType(getWrapper(result.get()))});
- return intf;
+ return extension.buildListType(result.get());
}
return null;
}
@@ -1695,10 +1690,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
PropertyExpression subExp = new PropertyExpression(varX("{}", types[0].getType()), pexp.getPropertyAsString());
AtomicReference<ClassNode> result = new AtomicReference<>();
if (existsProperty(subExp, true, new PropertyLookupVisitor(result))) {
- intf = LIST_TYPE.getPlainNodeReference();
- ClassNode itemType = result.get();
- intf.setGenericsTypes(new GenericsType[]{new GenericsType(wrapTypeIfNecessary(itemType))});
- return intf;
+ return extension.buildListType(result.get());
}
return null;
}
@@ -1805,9 +1797,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
protected void storeInferredTypeForPropertyExpression(final PropertyExpression pexp, final ClassNode flatInferredType) {
if (pexp.isSpreadSafe()) {
- ClassNode list = LIST_TYPE.getPlainNodeReference();
- list.setGenericsTypes(new GenericsType[]{new GenericsType(flatInferredType)});
- storeType(pexp, list);
+ storeType(pexp, extension.buildListType(flatInferredType));
} else {
storeType(pexp, flatInferredType);
}
@@ -3303,10 +3293,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
subcall.setImplicitThis(call.isImplicitThis());
visitMethodCallExpression(subcall);
// the inferred type here should be a list of what the subcall returns
- ClassNode subcallReturnType = getType(subcall);
- ClassNode listType = LIST_TYPE.getPlainNodeReference();
- listType.setGenericsTypes(new GenericsType[]{new GenericsType(wrapTypeIfNecessary(subcallReturnType))});
- storeType(call, listType);
+ storeType(call, extension.buildListType(getType(subcall)));
storeTargetMethod(call, subcall.getNodeMetaData(DIRECT_METHOD_CALL_TARGET));
}
typeCheckingContext.popEnclosingMethodCall();
diff --git a/src/main/java/org/codehaus/groovy/transform/stc/TypeCheckingExtension.java b/src/main/java/org/codehaus/groovy/transform/stc/TypeCheckingExtension.java
index d28d652..e0758dd 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/TypeCheckingExtension.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/TypeCheckingExtension.java
@@ -36,6 +36,7 @@ import org.codehaus.groovy.ast.expr.StaticMethodCallExpression;
import org.codehaus.groovy.ast.expr.VariableExpression;
import org.codehaus.groovy.ast.stmt.ReturnStatement;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -324,19 +325,21 @@ public class TypeCheckingExtension {
return null;
}
- public ClassNode parameterizedType(ClassNode baseType, ClassNode... genericsTypeArguments) {
+ public ClassNode parameterizedType(final ClassNode baseType, final ClassNode... genericsTypeArguments) {
+ if (baseType.isArray()) {
+ return parameterizedType(baseType.getComponentType(), genericsTypeArguments).makeArray();
+ }
ClassNode result = baseType.getPlainNodeReference();
- if (result.isUsingGenerics()) {
- GenericsType[] gts = new GenericsType[genericsTypeArguments.length];
- int expectedLength = result.getGenericsTypes().length;
- if (expectedLength!=genericsTypeArguments.length) {
- throw new GroovyBugError("Expected number of generic type arguments for "+baseType.toString(false)+" is "+expectedLength
- + " but you gave "+genericsTypeArguments.length);
- }
- for (int i = 0; i < gts.length; i++) {
- gts[i] = new GenericsType(genericsTypeArguments[i]);
+ GenericsType[] generics = baseType.redirect().getGenericsTypes();
+ if (generics != null) {
+ int expectedLength = generics.length;
+ if (expectedLength != genericsTypeArguments.length) {
+ throw new GroovyBugError("Expected number of generic type arguments for " + baseType.toString(false) + " is " + expectedLength + " but you gave " + genericsTypeArguments.length);
}
- result.setGenericsTypes(gts);
+ result.setGenericsTypes(Arrays.stream(genericsTypeArguments)
+ .map(StaticTypeCheckingVisitor::wrapTypeIfNecessary)
+ .map(GenericsType::new).toArray(GenericsType[]::new)
+ );
}
return result;
}