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

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


The following commit(s) were added to refs/heads/GROOVY_3_0_X by this push:
     new a6f3fca  GROOVY-10239, GROOVY-10318: STC: fallback to boolean for !in
a6f3fca is described below

commit a6f3fcacfd34ceca64605b0cd2d82968c9c5f06f
Author: Eric Milles <[email protected]>
AuthorDate: Fri Sep 17 12:03:20 2021 -0500

    GROOVY-10239, GROOVY-10318: STC: fallback to boolean for !in
    
    Conflicts:
        
src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
---
 .../transform/stc/StaticTypeCheckingVisitor.java   | 37 +++++++-------
 .../stc/ArraysAndCollectionsSTCTest.groovy         | 58 ++++++++++++++++++++++
 2 files changed, 77 insertions(+), 18 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 6824d92..6ee05da 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -766,27 +766,28 @@ public class StaticTypeCheckingVisitor extends 
ClassCodeVisitorSupport {
             ClassNode rType = isNullConstant(rightExpression) && 
!isPrimitiveType(lType)
                     ? UNKNOWN_PARAMETER_TYPE // null to primitive type is 
handled elsewhere
                     : getInferredTypeFromTempInfo(rightExpression, 
getType(rightExpression));
+            ClassNode resultType;
+            if (op == ELVIS_EQUAL) {
+                Expression fullExpression = new 
ElvisOperatorExpression(leftExpression, rightExpression);
+                fullExpression.setSourcePosition(expression);
+                fullExpression.visit(this);
 
-            BinaryExpression reversedBinaryExpression = binX(rightExpression, 
expression.getOperation(), leftExpression);
-            ClassNode resultType = (op == KEYWORD_IN || op == COMPARE_NOT_IN)
-                    ? getResultType(rType, op, lType, reversedBinaryExpression)
-                    : getResultType(lType, op, rType, expression);
-            if (op == KEYWORD_IN || op == COMPARE_NOT_IN) {
-                // in case of the "in" operator, the receiver and the 
arguments are reversed
-                // so we use the reversedExpression and get the target method 
from it
-                storeTargetMethod(expression, 
reversedBinaryExpression.getNodeMetaData(DIRECT_METHOD_CALL_TARGET));
-            } else if (op == LEFT_SQUARE_BRACKET
-                    && leftExpression instanceof VariableExpression
-                    && leftExpression.getNodeMetaData(INFERRED_TYPE) == null) {
-                storeType(leftExpression, lType);
-            } else if (op == ELVIS_EQUAL) {
-                ElvisOperatorExpression elvisOperatorExpression = new 
ElvisOperatorExpression(leftExpression, rightExpression);
-                elvisOperatorExpression.setSourcePosition(expression);
-                elvisOperatorExpression.visit(this);
-                resultType = getType(elvisOperatorExpression);
+                resultType = getType(fullExpression);
                 storeType(leftExpression, resultType);
+            } else if (op == KEYWORD_IN || op == COMPARE_NOT_IN) {
+                // for the "in" or "!in" operator, the receiver and the 
arguments are reversed
+                BinaryExpression reverseExpression = binX(rightExpression, 
expression.getOperation(), leftExpression);
+                resultType = getResultType(rType, op, lType, 
reverseExpression);
+                if (resultType == null) resultType = 
boolean_TYPE;//GROOVY-10239
+                storeTargetMethod(expression, 
reverseExpression.getNodeMetaData(DIRECT_METHOD_CALL_TARGET));
+            } else {
+                resultType = getResultType(lType, op, rType, expression);
+                if (op == LEFT_SQUARE_BRACKET
+                        && leftExpression instanceof VariableExpression
+                        && leftExpression.getNodeMetaData(INFERRED_TYPE) == 
null) {
+                    storeType(leftExpression, lType);
+                }
             }
-
             if (resultType == null) {
                 resultType = lType;
             }
diff --git a/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy 
b/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy
index 8bb50b2..d3a9b95 100644
--- a/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy
@@ -340,6 +340,64 @@ class ArraysAndCollectionsSTCTest extends 
StaticTypeCheckingTestCase {
         '''
     }
 
+    void testIsCaseArray() {
+        assertScript '''
+            def accept = new Integer[]{1}
+            def result = ['x','yy','zzz'].findAll { it.size() in accept }
+            assert result.size() == 1
+        '''
+    }
+
+    // GROOVY-10239
+    void testIsNotCaseArray() {
+        assertScript '''
+            def reject = new Integer[]{1}
+            def result = ['x','yy','zzz'].findAll { it.size() !in reject }
+            assert result.size() == 2
+        '''
+    }
+
+    void testIsCaseCollection() {
+        assertScript '''
+            def accept = [1]
+            def result = ['x','yy','zzz'].findAll { it.size() in accept }
+            assert result.size() == 1
+        '''
+    }
+
+    // GROOVY-10239
+    void testIsNotCaseCollection() {
+        assertScript '''
+            def reject = [1]
+            def result = ['x','yy','zzz'].findAll { it.size() !in reject }
+            assert result.size() == 2
+        '''
+    }
+
+    // GROOVY-10318
+    void testIsNotCaseCollection2() {
+        assertScript '''
+            class Pogo {
+                String foo, bar
+            }
+            @groovy.transform.CompileStatic
+            void test() {
+                def pogo = new Pogo(foo: 'foo', bar: 'bar')
+                Map<String, ?> filteredProperties = 
pogo.getProperties().findAll {
+                    String key = it.key
+                    @ASTTest(phase=INSTRUCTION_SELECTION, value={
+                      def type = node.getNodeMetaData(INFERRED_TYPE)
+                      assert type == boolean_TYPE
+                    })
+                    def result = key !in ['class']
+                    return result
+                }
+                assert filteredProperties.size() == 2
+            }
+            test()
+        '''
+    }
+
     // GROOVY-5177
     void testShouldNotAllowArrayAssignment() {
         shouldFailWithMessages '''

Reply via email to