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/09/10 18:27:08 UTC
[groovy] branch GROOVY_2_5_X updated: GROOVY-10291, GROOVY-10367: STC: diamond inference for object expression
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch GROOVY_2_5_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/GROOVY_2_5_X by this push:
new 7d17238646 GROOVY-10291, GROOVY-10367: STC: diamond inference for object expression
7d17238646 is described below
commit 7d172386461c92056f9e52ef065f7b7b6182dace
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sat Sep 10 13:14:28 2022 -0500
GROOVY-10291, GROOVY-10367: STC: diamond inference for object expression
2_5_X backport
---
.../transform/stc/StaticTypeCheckingVisitor.java | 38 +++++++++++-----------
.../groovy/transform/stc/GenericsSTCTest.groovy | 2 +-
2 files changed, 20 insertions(+), 20 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 3a985e541f..209917dcc8 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -1098,26 +1098,25 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
if (constructor != null && !argumentList.getExpressions().isEmpty()) {
ClassNode type = GenericsUtils.parameterizeType(cceType, cceType);
type = inferReturnTypeGenerics(type, constructor, argumentList);
- if (type.isUsingGenerics()) {
- // GROOVY-6232, GROOVY-9956: if cce not assignment compatible, process target as additional type witness
- if (checkCompatibleAssignmentTypes(lType, type, cce) && !GenericsUtils.buildWildcardType(lType).isCompatibleWith(type)) {
- // allow covariance of each type parameter, but maintain semantics for nested generics
-
- ClassNode pType = GenericsUtils.parameterizeType(lType, type);
- GenericsType[] lhs = pType.getGenericsTypes(), rhs = type.getGenericsTypes();
- if (lhs == null || rhs == null || lhs.length != rhs.length) throw new GroovyBugError(
- "Parameterization failed: " + prettyPrintType(pType) + " ~ " + prettyPrintType(type));
-
- boolean allMatch = true;
- for (int i = 0, n = lhs.length; i < n && allMatch; i += 1) {
- if (!GenericsUtils.buildWildcardType(getCombinedBoundType(lhs[i])).isCompatibleWith(getCombinedBoundType(rhs[i]))) {
- allMatch = false;
- }
+ if (lType.getGenericsTypes() != null // GROOVY-10367: nothing to inspect
+ // GROOVY-6232, GROOVY-9956: if cce not assignment compatible, process target as additional type witness
+ && checkCompatibleAssignmentTypes(lType, type, cce) && !GenericsUtils.buildWildcardType(lType).isCompatibleWith(type)) {
+ // allow covariance of each type parameter, but maintain semantics for nested generics
+
+ ClassNode pType = GenericsUtils.parameterizeType(lType, type);
+ GenericsType[] lhs = pType.getGenericsTypes(), rhs = type.getGenericsTypes();
+ if (lhs == null || rhs == null || lhs.length != rhs.length) throw new GroovyBugError(
+ "Parameterization failed: " + prettyPrintType(pType) + " ~ " + prettyPrintType(type));
+
+ boolean allMatch = true;
+ for (int i = 0, n = lhs.length; i < n && allMatch; i += 1) {
+ if (!GenericsUtils.buildWildcardType(getCombinedBoundType(lhs[i])).isCompatibleWith(getCombinedBoundType(rhs[i]))) {
+ allMatch = false;
}
- if (allMatch) type = pType; // lType proved to be a viable type witness
}
- inferredType = type;
+ if (allMatch) type = pType; // lType proved to be a viable type witness
}
+ inferredType = type;
}
if (inferredType.isGenericsPlaceHolder()) // GROOVY-10344: "T t = new C<>()"
inferredType = getCombinedBoundType(inferredType.getGenericsTypes()[0]);
@@ -1475,8 +1474,9 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
Expression objectExpression = pexp.getObjectExpression();
ClassNode objectExpressionType = getType(objectExpression);
- if (objectExpression instanceof ConstructorCallExpression) { // GROOVY-9963
- inferDiamondType((ConstructorCallExpression) objectExpression, objectExpressionType);
+ if (objectExpression instanceof ConstructorCallExpression) {
+ ClassNode rawType = objectExpressionType.getPlainNodeReference();
+ inferDiamondType((ConstructorCallExpression) objectExpression, rawType);
}
List<ClassNode> enclosingTypes = typeCheckingContext.getEnclosingClassNodes();
boolean staticOnlyAccess = isClassClassNodeWrappingConcreteType(objectExpressionType);
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index da631e99fa..0086a47d55 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -906,7 +906,7 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
}
}
- @NotYetImplemented // GROOVY-10367
+ // GROOVY-10367
void testDiamondInferrenceFromConstructor26() {
assertScript '''
@groovy.transform.TupleConstructor(defaults=false)