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/08/28 22:33:46 UTC

[groovy] branch GROOVY_2_5_X updated: GROOVY-8686: restrict `instanceof` flow type to enclosing statement

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 9b842577a2 GROOVY-8686: restrict `instanceof` flow type to enclosing statement
9b842577a2 is described below

commit 9b842577a2163103335e7ba901e9b0bf772c23b5
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sun Aug 28 17:16:41 2022 -0500

    GROOVY-8686: restrict `instanceof` flow type to enclosing statement
---
 .../transform/stc/StaticTypeCheckingVisitor.java   |  8 +++++
 .../transform/stc/TypeInferenceSTCTest.groovy      | 40 ++++++++++++++--------
 2 files changed, 34 insertions(+), 14 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 c1018db36e..acd0ba3acf 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -83,6 +83,7 @@ import org.codehaus.groovy.ast.stmt.BlockStatement;
 import org.codehaus.groovy.ast.stmt.CaseStatement;
 import org.codehaus.groovy.ast.stmt.CatchStatement;
 import org.codehaus.groovy.ast.stmt.EmptyStatement;
+import org.codehaus.groovy.ast.stmt.ExpressionStatement;
 import org.codehaus.groovy.ast.stmt.ForStatement;
 import org.codehaus.groovy.ast.stmt.IfStatement;
 import org.codehaus.groovy.ast.stmt.ReturnStatement;
@@ -2218,6 +2219,13 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
         typeCheckingContext.popEnclosingMethod();
     }
 
+    @Override
+    public void visitExpressionStatement(ExpressionStatement statement) {
+        typeCheckingContext.pushTemporaryTypeInfo();
+        super.visitExpressionStatement(statement);
+        typeCheckingContext.popTemporaryTypeInfo();
+    }
+
     @Override
     public void visitReturnStatement(ReturnStatement statement) {
         typeCheckingContext.pushEnclosingReturnStatement(statement);
diff --git a/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy b/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy
index a639a7ac75..d4fe1c834f 100644
--- a/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy
+++ b/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy
@@ -159,6 +159,21 @@ class TypeInferenceSTCTest extends StaticTypeCheckingTestCase {
         '''
     }
 
+    // GROOVY-6127
+    void testInstanceOfSix() {
+        assertScript '''
+            def convertValueToType(value, Class targetType) {
+                if (value instanceof CharSequence) {
+                    value = value.toString()
+                }
+                if (value instanceof String) {
+                    String strValue = value.trim()
+                }
+            }
+            convertValueToType('foo', String)
+        '''
+    }
+
     // GROOVY-9953
     void testInstanceOf6() {
         assertScript '''
@@ -226,6 +241,17 @@ class TypeInferenceSTCTest extends StaticTypeCheckingTestCase {
         '''
     }
 
+    // GROOVY-8686
+    void testInstanceOf9() {
+         shouldFailWithMessages '''
+            def m(obj) {
+                boolean isA = (obj instanceof String && obj.equalsIgnoreCase('a'))
+                obj.toLowerCase() // typeof(obj) should be Object, not String
+            }
+        ''',
+        'Cannot find matching method java.lang.Object#toLowerCase'
+    }
+
     void testNestedInstanceOf1() {
         assertScript '''
             Object o
@@ -936,20 +962,6 @@ class TypeInferenceSTCTest extends StaticTypeCheckingTestCase {
         '''
     }
 
-    void testShouldNotThrowIncompatibleArgToFunVerifyError() {
-        assertScript '''
-            Object convertValueToType(Object value, Class targetType) {
-                if (value instanceof CharSequence) {
-                    value = value.toString()
-                }
-                if (value instanceof String) {
-                    String strValue = value.trim()
-                }
-            }
-            convertValueToType('foo', String)
-        '''
-    }
-
     void testSwitchCaseAnalysis() {
         assertScript '''
             import org.codehaus.groovy.ast.tools.WideningCategories.LowestUpperBoundClassNode as LUB