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 2021/08/19 15:43:39 UTC
[groovy] 02/05: GROOVY-9985, GROOVY-9994,
GROOVY-10111: STC: check array sizes and values (not like cast)
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
commit 2ebcc54bb52c1936387465cc926651a2efc1949d
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Wed May 26 17:22:25 2021 -0500
GROOVY-9985, GROOVY-9994, GROOVY-10111: STC: check array sizes and values (not like cast)
---
.../transform/stc/StaticTypeCheckingVisitor.java | 22 +++++++-----
.../stc/ArraysAndCollectionsSTCTest.groovy | 40 ++++++++++++++++++++--
2 files changed, 51 insertions(+), 11 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 26a9385..4afb2ec 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -4091,14 +4091,20 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
}
@Override
- public void visitArrayExpression(ArrayExpression source) {
- super.visitArrayExpression(source);
- ClassNode elementType = source.getElementType();
- for (Expression expression : source.getExpressions()) {
- if (!checkCast(elementType, expression)) {
- addStaticTypeError("Cannot assign value of type " +
- prettyPrintType(getType(expression)) + " into array of type " +
- prettyPrintType(source.getType()), expression);
+ public void visitArrayExpression(final ArrayExpression expression) {
+ super.visitArrayExpression(expression);
+ ClassNode elementType;
+ List<Expression> expressions;
+ if (expression.hasInitializer()) {
+ elementType = expression.getElementType();
+ expressions = expression.getExpressions();
+ } else {
+ elementType = int_TYPE;
+ expressions = expression.getSizeExpression();
+ }
+ for (Expression elementExpr : expressions) {
+ if (!checkCompatibleAssignmentTypes(elementType, getType(elementExpr), elementExpr, false)) {
+ addStaticTypeError("Cannot convert from " + prettyPrintType(getType(elementExpr)) + " to " + prettyPrintType(elementType), elementExpr);
}
}
}
diff --git a/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy b/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy
index fb0d2ab..716b1a8 100644
--- a/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy
@@ -28,10 +28,11 @@ class ArraysAndCollectionsSTCTest extends StaticTypeCheckingTestCase {
assertScript '''
String[] strings = ['a','b','c']
String str = strings[0]
+ assert str == 'a'
'''
}
- void testArrayElementReturnType() {
+ void testArrayElementTypeInference() {
shouldFailWithMessages '''
String[] strings = ['a','b','c']
int str = strings[0]
@@ -44,10 +45,43 @@ class ArraysAndCollectionsSTCTest extends StaticTypeCheckingTestCase {
''', 'Cannot assign value of type java.lang.String into array of type int[]'
}
+ // GROOVY-9985, GROOVY-9994
void testWrongComponentTypeInArrayInitializer() {
shouldFailWithMessages '''
- int[] intArray = new int[]{'a'}
- ''', 'Cannot assign value of type java.lang.String into array of type int[]'
+ new int['a']
+ ''', 'Cannot convert from java.lang.String to int'
+ shouldFailWithMessages '''
+ new int[]{'a'}
+ ''', 'Cannot convert from java.lang.String to int'
+ shouldFailWithMessages '''
+ new Integer[]{new Object(),1}
+ ''', 'Cannot convert from java.lang.Object to java.lang.Integer'
+ }
+
+ // GROOVY-10111
+ void testBoundedComponentTypeInArrayInitializer() {
+ assertScript '''
+ class C<X, Y> {
+ }
+ def <X extends C<Number, String>> X[] m() {
+ new X[]{new C<Number, String>()}
+ }
+ '''
+ shouldFailWithMessages '''
+ class C<X, Y> {
+ }
+ def <X extends C<Number, String>> X[] m() {
+ new X[]{new C<Object, String>()}
+ }
+ ''', 'Cannot convert from C<java.lang.Object, java.lang.String> to X'
+ }
+
+ void testConvertibleTypesInArrayInitializer() {
+ assertScript '''
+ def strings = new String[]{1,(long)2,(short)3}
+ assert strings.every { it.class == String }
+ assert strings.toString() == '[1, 2, 3]'
+ '''
}
void testAssignValueInArrayWithCorrectType() {