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