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 2020/03/09 18:52:39 UTC

[groovy] 01/01: GROOVY-9454: STC: check for instanceof type before using the field type

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

emilles pushed a commit to branch GROOVY-9454
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit 375dfbd803073b4711154059001f913a8e7d7a4e
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon Mar 9 13:52:23 2020 -0500

    GROOVY-9454: STC: check for instanceof type before using the field type
---
 .../transform/stc/StaticTypeCheckingVisitor.java   | 22 ++++++++++++++--------
 .../transform/stc/TypeInferenceSTCTest.groovy      |  3 +--
 2 files changed, 15 insertions(+), 10 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 e41f14b..08a07c5 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -604,14 +604,20 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
             if (enclosingClosure != null) {
                 tryVariableExpressionAsProperty(vexp, name);
             } else {
-                // GROOVY-7691
-                FieldNode fieldNode = (FieldNode) accessedVariable;
-                ClassNode actualType = findActualTypeByGenericsPlaceholderName(
-                        fieldNode.getOriginType().getUnresolvedName(),
-                        makeDeclaringAndActualGenericsTypeMapOfExactType(fieldNode.getDeclaringClass(), typeCheckingContext.getEnclosingClassNode())
-                );
-                if (actualType != null) {
-                    storeType(vexp, actualType);
+                // GROOVY-9454
+                ClassNode inferredType = getInferredTypeFromTempInfo(vexp, null);
+                if (inferredType != null && !inferredType.equals(OBJECT_TYPE)) {
+                    vexp.putNodeMetaData(INFERRED_RETURN_TYPE, inferredType);
+                } else {
+                    // GROOVY-7691
+                    FieldNode fieldNode = (FieldNode) accessedVariable;
+                    ClassNode fieldType = findActualTypeByGenericsPlaceholderName(
+                            fieldNode.getOriginType().getUnresolvedName(),
+                            makeDeclaringAndActualGenericsTypeMapOfExactType(fieldNode.getDeclaringClass(), typeCheckingContext.getEnclosingClassNode())
+                    );
+                    if (fieldType != null) {
+                        storeType(vexp, fieldType);
+                    }
                 }
             }
         } else if (accessedVariable instanceof PropertyNode) {
diff --git a/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy b/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy
index 2562166..3813e75 100644
--- a/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy
+++ b/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy
@@ -18,7 +18,6 @@
  */
 package groovy.transform.stc
 
-import groovy.test.NotYetImplemented
 import org.codehaus.groovy.ast.ClassHelper
 import org.codehaus.groovy.ast.ClassNode
 import org.codehaus.groovy.ast.MethodNode
@@ -142,7 +141,7 @@ class TypeInferenceSTCTest extends StaticTypeCheckingTestCase {
         ''', 'Cannot find matching method java.lang.Object#toUpperCase()'
     }
 
-    @NotYetImplemented // GROOVY-9454
+    // GROOVY-9454
     void testInstanceOfOnGenericProperty() {
         assertScript '''
             interface Face {