Skip to content

Commit e50f68f

Browse files
committed
GROOVY-8974
1 parent dc6055e commit e50f68f

File tree

7 files changed

+42
-12
lines changed

7 files changed

+42
-12
lines changed

base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/TypeCheckedTests.java

+18
Original file line numberDiff line numberDiff line change
@@ -766,6 +766,24 @@ public void testTypeChecked8909a() {
766766
"----------\n");
767767
}
768768

769+
@Test
770+
public void testTypeChecked8974() {
771+
//@formatter:off
772+
String[] sources = {
773+
"Main.groovy",
774+
"def <T> T identity(T t) { t }\n" +
775+
"@groovy.transform.TypeChecked\n" +
776+
"void test() {\n" +
777+
" List<String> list = identity(new ArrayList<>())\n" +
778+
" list.add('foo'); print list.get(0).toUpperCase()\n" +
779+
"}\n" +
780+
"test()\n",
781+
};
782+
//@formatter:on
783+
784+
runConformTest(sources, "FOO");
785+
}
786+
769787
@Test
770788
public void testTypeChecked8983() {
771789
//@formatter:off

base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -2411,7 +2411,7 @@ public static boolean isParameterizedWithString(ClassNode node) {
24112411
}
24122412

24132413
public static boolean missesGenericsTypes(ClassNode cn) {
2414-
/* GRECLIPSE edit -- GROOVY-9033
2414+
/* GRECLIPSE edit -- GROOVY-8794, GROOVY-9033
24152415
if (cn.isArray()) return missesGenericsTypes(cn.getComponentType());
24162416
GenericsType[] cnTypes = cn.getGenericsTypes();
24172417
GenericsType[] rnTypes = cn.redirect().getGenericsTypes();
@@ -2426,7 +2426,7 @@ public static boolean missesGenericsTypes(ClassNode cn) {
24262426
while (cn.isArray()) cn = cn.getComponentType();
24272427
GenericsType[] cnGenerics = cn.getGenericsTypes();
24282428
GenericsType[] rnGenerics = cn.redirect().getGenericsTypes();
2429-
return cnGenerics == null ? rnGenerics != null : GenericsUtils.hasUnresolvedGenerics(cn);
2429+
return cnGenerics == null || cnGenerics.length == 0 ? rnGenerics != null : GenericsUtils.hasUnresolvedGenerics(cn);
24302430
// GRECLIPSE end
24312431
}
24322432

base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -936,7 +936,7 @@ else if (op == LOGICAL_OR) {
936936
}
937937
}
938938

939-
/* GRECLIPSE edit -- GROOVY-9033
939+
/* GRECLIPSE edit -- GROOVY-8974, GROOVY-9033
940940
if (lType.isUsingGenerics() && missesGenericsTypes(resultType) && isAssignment(op)) {
941941
// unchecked assignment
942942
// examples:
@@ -952,6 +952,9 @@ else if (op == LOGICAL_OR) {
952952
}
953953
*/
954954
if (isAssignment(op)) {
955+
if (rightExpression instanceof ConstructorCallExpression) {
956+
inferDiamondType((ConstructorCallExpression) rightExpression, lType);
957+
}
955958
if (lType.isUsingGenerics() && missesGenericsTypes(resultType)) {
956959
resultType = GenericsUtils.parameterizeType(lType, resultType.getPlainNodeReference());
957960
} else if (lType.equals(OBJECT_TYPE) && GenericsUtils.hasUnresolvedGenerics(resultType)) { // def list = []
@@ -982,10 +985,11 @@ && isAssignment(enclosingBinaryExpression.getOperation().getType())) {
982985

983986
boolean isEmptyDeclaration = expression instanceof DeclarationExpression && rightExpression instanceof EmptyExpression;
984987
if (!isEmptyDeclaration && isAssignment(op)) {
988+
/* GRECLIPSE edit -- GROOVY-8974
985989
if (rightExpression instanceof ConstructorCallExpression) {
986990
inferDiamondType((ConstructorCallExpression) rightExpression, lType);
987991
}
988-
992+
*/
989993
ClassNode originType = getOriginalDeclarationType(leftExpression);
990994
typeCheckAssignment(expression, leftExpression, originType, rightExpression, resultType);
991995
// if assignment succeeds but result type is not a subtype of original type, then we are in a special cast handling

base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -2253,7 +2253,7 @@ public static boolean isParameterizedWithString(final ClassNode node) {
22532253
}
22542254

22552255
public static boolean missesGenericsTypes(ClassNode cn) {
2256-
/* GRECLIPSE edit -- GROOVY-9033
2256+
/* GRECLIPSE edit -- GROOVY-8974, GROOVY-9033
22572257
if (cn.isArray()) return missesGenericsTypes(cn.getComponentType());
22582258
GenericsType[] cnTypes = cn.getGenericsTypes();
22592259
GenericsType[] rnTypes = cn.redirect().getGenericsTypes();
@@ -2277,7 +2277,7 @@ public static boolean missesGenericsTypes(ClassNode cn) {
22772277
while (cn.isArray()) cn = cn.getComponentType();
22782278
GenericsType[] cnGenerics = cn.getGenericsTypes();
22792279
GenericsType[] rnGenerics = cn.redirect().getGenericsTypes();
2280-
return cnGenerics == null ? rnGenerics != null : GenericsUtils.hasUnresolvedGenerics(cn);
2280+
return cnGenerics == null || cnGenerics.length == 0 ? rnGenerics != null : GenericsUtils.hasUnresolvedGenerics(cn);
22812281
// GRECLIPSE end
22822282
}
22832283

base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -817,7 +817,7 @@ else if (op == LOGICAL_OR) {
817817
}
818818

819819
boolean isAssignment = isAssignment(expression.getOperation().getType());
820-
/* GRECLIPSE edit -- GROOVY-9033
820+
/* GRECLIPSE edit -- GROOVY-8974, GROOVY-9033
821821
if (isAssignment && lType.isUsingGenerics() && missesGenericsTypes(resultType)) {
822822
// unchecked assignment
823823
// examples:
@@ -833,6 +833,9 @@ else if (op == LOGICAL_OR) {
833833
}
834834
*/
835835
if (isAssignment) {
836+
if (rightExpression instanceof ConstructorCallExpression) {
837+
inferDiamondType((ConstructorCallExpression) rightExpression, lType);
838+
}
836839
if (lType.isUsingGenerics() && missesGenericsTypes(resultType)) {
837840
resultType = GenericsUtils.parameterizeType(lType, resultType.getPlainNodeReference());
838841
} else if (lType.equals(OBJECT_TYPE) && GenericsUtils.hasUnresolvedGenerics(resultType)) { // def list = []
@@ -863,10 +866,11 @@ && isAssignment(enclosingBinaryExpression.getOperation().getType())) {
863866

864867
boolean isEmptyDeclaration = (expression instanceof DeclarationExpression && rightExpression instanceof EmptyExpression);
865868
if (isAssignment && !isEmptyDeclaration) {
869+
/* GRECLIPSE edit -- GROOVY-8974
866870
if (rightExpression instanceof ConstructorCallExpression) {
867871
inferDiamondType((ConstructorCallExpression) rightExpression, lType);
868872
}
869-
873+
*/
870874
ClassNode originType = getOriginalDeclarationType(leftExpression);
871875
typeCheckAssignment(expression, leftExpression, originType, rightExpression, resultType);
872876
// if assignment succeeds but result type is not a subtype of original type, then we are in a special cast handling

base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -2187,7 +2187,7 @@ public static boolean isParameterizedWithString(final ClassNode node) {
21872187
}
21882188

21892189
public static boolean missesGenericsTypes(ClassNode cn) {
2190-
/* GRECLIPSE edit -- GROOVY-9033
2190+
/* GRECLIPSE edit -- GROOVY-8974, GROOVY-9033
21912191
if (cn.isArray()) return missesGenericsTypes(cn.getComponentType());
21922192
GenericsType[] cnTypes = cn.getGenericsTypes();
21932193
GenericsType[] rnTypes = cn.redirect().getGenericsTypes();
@@ -2211,7 +2211,7 @@ public static boolean missesGenericsTypes(ClassNode cn) {
22112211
while (cn.isArray()) cn = cn.getComponentType();
22122212
GenericsType[] cnGenerics = cn.getGenericsTypes();
22132213
GenericsType[] rnGenerics = cn.redirect().getGenericsTypes();
2214-
return cnGenerics == null ? rnGenerics != null : GenericsUtils.hasUnresolvedGenerics(cn);
2214+
return cnGenerics == null || cnGenerics.length == 0 ? rnGenerics != null : GenericsUtils.hasUnresolvedGenerics(cn);
22152215
// GRECLIPSE end
22162216
}
22172217

base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -808,7 +808,7 @@ else if (op == LOGICAL_OR) {
808808

809809
if (resultType == null) {
810810
resultType = lType;
811-
/* GRECLIPSE edit -- GROOVY-9033
811+
/* GRECLIPSE edit -- GROOVY-8974, GROOVY-9033
812812
} else if (lType.isUsingGenerics() && isAssignment(op) && missesGenericsTypes(resultType)) {
813813
// unchecked assignment
814814
// List<Type> list = new LinkedList()
@@ -821,6 +821,9 @@ else if (op == LOGICAL_OR) {
821821
}
822822
*/
823823
} else if (isAssignment(op)) {
824+
if (rightExpression instanceof ConstructorCallExpression) {
825+
inferDiamondType((ConstructorCallExpression) rightExpression, lType);
826+
}
824827
if (lType.isUsingGenerics() && missesGenericsTypes(resultType)) {
825828
resultType = GenericsUtils.parameterizeType(lType, resultType.getPlainNodeReference());
826829
} else if (lType.equals(OBJECT_TYPE) && GenericsUtils.hasUnresolvedGenerics(resultType)) { // def list = []
@@ -856,10 +859,11 @@ && isAssignment(enclosingBinaryExpression.getOperation().getType())) {
856859

857860
boolean isEmptyDeclaration = (expression instanceof DeclarationExpression && rightExpression instanceof EmptyExpression);
858861
if (!isEmptyDeclaration && isAssignment(op)) {
862+
/* GRECLIPSE edit -- GROOVY-8974
859863
if (rightExpression instanceof ConstructorCallExpression) {
860864
inferDiamondType((ConstructorCallExpression) rightExpression, lType);
861865
}
862-
866+
*/
863867
ClassNode originType = getOriginalDeclarationType(leftExpression);
864868
typeCheckAssignment(expression, leftExpression, originType, rightExpression, resultType);
865869
// if assignment succeeds but result type is not a subtype of original type, then we are in a special cast handling

0 commit comments

Comments
 (0)