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 2022/03/08 21:10:00 UTC

[groovy] 02/02: STC: alignment of source and target

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

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

commit 344399df1e7e2edf5e8e330a868390f5cd2e8540
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Mar 8 12:17:47 2022 -0600

    STC: alignment of source and target
---
 .../java/org/codehaus/groovy/ast/tools/GenericsUtils.java | 12 ++----------
 .../groovy/transform/stc/StaticTypeCheckingSupport.java   | 15 +++++++--------
 .../groovy/transform/stc/StaticTypeCheckingVisitor.java   |  5 ++++-
 src/test/groovy/transform/stc/GenericsSTCTest.groovy      |  6 +++---
 4 files changed, 16 insertions(+), 22 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java b/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
index 8e9d9bb..fd3cbc9 100644
--- a/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
+++ b/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
@@ -555,16 +555,8 @@ public class GenericsUtils {
         }
     }
 
-    public static ClassNode getSuperClass(ClassNode type, ClassNode target) {
-        ClassNode superClass = ClassHelper.getNextSuperClass(type, target);
-
-        if (superClass == null) {
-            if (ClassHelper.isPrimitiveType(type)) {
-                superClass = ClassHelper.getNextSuperClass(ClassHelper.getWrapper(type), target);
-            }
-        }
-
-        return superClass;
+    public static ClassNode getSuperClass(final ClassNode type, final ClassNode target) {
+        return ClassHelper.getNextSuperClass(ClassHelper.isPrimitiveType(type) ? ClassHelper.getWrapper(type) : type, target);
     }
 
     private static void extractSuperClassGenerics(final GenericsType[] usage, final GenericsType[] declaration, final Map<String, ClassNode> spec) {
diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
index dbee960..ce00d87 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -100,6 +100,7 @@ import static org.codehaus.groovy.ast.ClassHelper.char_TYPE;
 import static org.codehaus.groovy.ast.ClassHelper.double_TYPE;
 import static org.codehaus.groovy.ast.ClassHelper.findSAM;
 import static org.codehaus.groovy.ast.ClassHelper.float_TYPE;
+import static org.codehaus.groovy.ast.ClassHelper.getNextSuperClass;
 import static org.codehaus.groovy.ast.ClassHelper.getUnwrapper;
 import static org.codehaus.groovy.ast.ClassHelper.getWrapper;
 import static org.codehaus.groovy.ast.ClassHelper.int_TYPE;
@@ -120,7 +121,6 @@ import static org.codehaus.groovy.ast.ClassHelper.make;
 import static org.codehaus.groovy.ast.ClassHelper.makeWithoutCaching;
 import static org.codehaus.groovy.ast.ClassHelper.short_TYPE;
 import static org.codehaus.groovy.ast.ClassHelper.void_WRAPPER_TYPE;
-import static org.codehaus.groovy.ast.tools.GenericsUtils.makeClassSafe0;
 import static org.codehaus.groovy.ast.tools.WideningCategories.isBigIntCategory;
 import static org.codehaus.groovy.ast.tools.WideningCategories.isFloatingCategory;
 import static org.codehaus.groovy.ast.tools.WideningCategories.isNumberCategory;
@@ -1454,7 +1454,7 @@ public abstract class StaticTypeCheckingSupport {
                     // GROOVY-8034: non-static method may use class generics
                     gts = applyGenericsContext(candidateGenerics, gts);
                 }
-                GenericsUtils.extractPlaceholders(makeClassSafe0(OBJECT_TYPE, gts), candidateGenerics);
+                GenericsUtils.extractPlaceholders(GenericsUtils.makeClassSafe0(OBJECT_TYPE, gts), candidateGenerics);
 
                 // the outside context parts till now define placeholder we are not allowed to
                 // generalize, thus we save that for later use...
@@ -1734,12 +1734,11 @@ public abstract class StaticTypeCheckingSupport {
             ClassNode returnType = StaticTypeCheckingVisitor.wrapTypeIfNecessary(GenericsUtils.parameterizeSAM(target).getV2());
             extractGenericsConnections(connections, type.getGenericsTypes(), new GenericsType[] {returnType.asGenericsType()});
 
-        } else if (type.equals(target) || !implementsInterfaceOrIsSubclassOf(type, target)) {
+        } else if (type.equals(target)) {
             extractGenericsConnections(connections, type.getGenericsTypes(), target.getGenericsTypes());
 
-        } else {
-            // find matching super class or interface
-            ClassNode superClass = GenericsUtils.getSuperClass(type, target);
+        } else if (implementsInterfaceOrIsSubclassOf(type, target)) {
+            ClassNode superClass = getNextSuperClass(type, target);
             if (superClass != null) {
                 if (GenericsUtils.hasUnresolvedGenerics(superClass)) {
                     Map<String, ClassNode> spec = GenericsUtils.createGenericsSpec(type);
@@ -1922,8 +1921,8 @@ public abstract class StaticTypeCheckingSupport {
     }
 
     static GenericsType getCombinedGenericsType(final GenericsType gt1, final GenericsType gt2) {
-        ClassNode cn1 = makeClassSafe0(CLASS_Type, gt1);
-        ClassNode cn2 = makeClassSafe0(CLASS_Type, gt2);
+        ClassNode cn1 = GenericsUtils.makeClassSafe0(CLASS_Type, gt1);
+        ClassNode cn2 = GenericsUtils.makeClassSafe0(CLASS_Type, gt2);
         ClassNode lub = lowestUpperBound(cn1,cn2);
         return lub.getGenericsTypes()[0];
     }
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 854a267..87cf0f7 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -863,7 +863,10 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
                     } else if (!resultType.isGenericsPlaceHolder()) { // GROOVY-10324
                         Map<GenericsTypeName, GenericsType> gt = new HashMap<>();
                         extractGenericsConnections(gt, resultType, resultType.redirect());
-                        extractGenericsConnections(gt, lType, getNextSuperClass(resultType, lType));
+                        ClassNode sc = resultType;
+                        do { sc = getNextSuperClass(sc, lType);
+                        } while (sc != null && !sc.equals(lType));
+                        extractGenericsConnections(gt, lType, sc);
 
                         resultType = applyGenericsContext(gt, resultType.redirect());// GROOVY-10235, et al.
                     }
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index 0e2559f..a372aa3 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -2443,10 +2443,10 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
         assertScript '''
             @ASTTest(phase=INSTRUCTION_SELECTION, value={
                 def ift = node.getNodeMetaData(INFERRED_TYPE)
-                assert ift == make(List)
-                assert ift.isUsingGenerics()
+                assert ift == LIST_TYPE
                 def gts = ift.genericsTypes
-                assert gts.length==1
+                assert gts != null
+                assert gts.length == 1
                 assert gts[0].type == STRING_TYPE
             })
             Iterable<String> list = (List) null