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