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 <[email protected]>
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)