You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2021/04/10 23:37:28 UTC

[groovy] 02/02: GROOVY-10011: STC: instanceof refines declared type for diamond operator (closes #1545) (port to 3_0_X)

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

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

commit 7b9297cfd639ba14225c99299700706cdd35381b
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Apr 6 08:59:31 2021 -0500

    GROOVY-10011: STC: instanceof refines declared type for diamond operator (closes #1545) (port to 3_0_X)
---
 .../transform/stc/StaticTypeCheckingVisitor.java      |  8 ++++++--
 src/test/groovy/transform/stc/GenericsSTCTest.groovy  | 19 +++++++++++++++++++
 2 files changed, 25 insertions(+), 2 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 e025180..49f5353 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -5447,11 +5447,15 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
     }
 
     private ClassNode getDeclaredOrInferredType(final Expression expression) {
+        ClassNode declaredOrInferred;
         // in case of "T t = new ExtendsOrImplementsT()", return T for the expression type
         if (expression instanceof Variable && !((Variable) expression).isDynamicTyped()) {
-            return getOriginalDeclarationType(expression); // GROOVY-9996
+            declaredOrInferred = getOriginalDeclarationType(expression); // GROOVY-9996
+        } else {
+            declaredOrInferred = getType(expression);
         }
-        return getInferredTypeFromTempInfo(expression, getType(expression));
+        // GROOVY-10011: apply instanceof constraints to either option
+        return getInferredTypeFromTempInfo(expression, declaredOrInferred);
     }
 
     private static ClassNode getDeclaringClass(final MethodNode method, final Expression arguments) {
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index b5020e3..be9319e 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -213,6 +213,25 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
         '''
     }
 
+    // GROOVY-10011
+    void testDiamondInferrenceFromConstructor8b() {
+        assertScript '''
+            @groovy.transform.TupleConstructor(defaults=false)
+            class C<T> {
+                T p
+            }
+            interface I { }
+            class D implements I { }
+
+            void test(I i) {
+                if (i instanceof D) {
+                    C<D> cd = new C<>(i)
+                }
+            }
+            test(new D())
+        '''
+    }
+
     void testLinkedListWithListArgument() {
         assertScript '''
             List<String> list = new LinkedList<String>(['1','2','3'])