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)