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 '''