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