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 21:48:24 UTC

[groovy] branch master updated: GROOVY-10011: STC: instanceof refines declared type for diamond operator (closes #1545)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 131728f  GROOVY-10011: STC: instanceof refines declared type for diamond operator (closes #1545)
131728f is described below

commit 131728feed3005173aee3fcff4f7a97b2ac78410
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)
---
 .../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 4952cc1..9a35798 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -5546,11 +5546,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 ac1f8a7..b6ecffb 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -343,6 +343,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 testDiamondInferrenceFromConstructor9() {
         assertScript '''
             abstract class A<X> { }