Skip to content

Commit fcbfaab

Browse files
committed
GROOVY-9996
1 parent 07adab7 commit fcbfaab

File tree

4 files changed

+69
-2
lines changed

4 files changed

+69
-2
lines changed

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

+25
Original file line numberDiff line numberDiff line change
@@ -1360,6 +1360,31 @@ public void testTypeChecked9995() {
13601360
runConformTest(sources, "1");
13611361
}
13621362

1363+
@Test
1364+
public void testTypeChecked9996() {
1365+
//@formatter:off
1366+
String[] sources = {
1367+
"Main.groovy",
1368+
"@groovy.transform.TupleConstructor(defaults=false)\n" +
1369+
"class A<T> {\n" +
1370+
" T p\n" +
1371+
"}\n" +
1372+
"class B { }\n" +
1373+
"class C extends B { }\n" +
1374+
"static m(A<B> ab) { }\n" +
1375+
"@groovy.transform.TypeChecked\n" +
1376+
"void test() {\n" +
1377+
" B b = new C()\n" + // "b" infers as C
1378+
" def a = new A<>(b)\n" + // "a" infers as A<C>
1379+
" m(a)\n" +
1380+
"}\n" +
1381+
"test()\n",
1382+
};
1383+
//@formatter:on
1384+
1385+
runConformTest(sources, "");
1386+
}
1387+
13631388
@Test
13641389
public void testTypeChecked9997() {
13651390
//@formatter:off

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

+16-2
Original file line numberDiff line numberDiff line change
@@ -5674,10 +5674,14 @@ protected ClassNode inferReturnTypeGenerics(
56745674
List<Expression> expressions = argList.getExpressions();
56755675
int paramLength = parameters.length;
56765676
if (expressions.size() >= paramLength) {
5677-
for (int i = 0; i < paramLength; i++) {
5678-
boolean lastArg = i == paramLength - 1;
5677+
for (int i = 0; i < paramLength; i += 1) {
5678+
boolean lastArg = (i == paramLength - 1);
56795679
ClassNode type = parameters[i].getType();
5680+
/* GRECLIPSE edit -- GROOVY-9996
56805681
ClassNode actualType = getType(expressions.get(i));
5682+
*/
5683+
ClassNode actualType = getDeclaredOrInferredType(expressions.get(i));
5684+
// GRECLIPSE end
56815685
while (!type.isUsingGenerics() && type.isArray() && actualType.isArray()) {
56825686
type = type.getComponentType();
56835687
actualType = actualType.getComponentType();
@@ -5976,6 +5980,16 @@ private ClassNode resolveGenericsWithContext(Map<GenericsTypeName, GenericsType>
59765980
return resolveClassNodeGenerics(resolvedPlaceholders, placeholdersFromContext, currentType);
59775981
}
59785982

5983+
// GRECLIPSE add
5984+
private ClassNode getDeclaredOrInferredType(final Expression expression) {
5985+
// in case of "T t = new ExtendsOrImplementsT()", return T for the expression type
5986+
if (expression instanceof Variable && !((Variable) expression).isDynamicTyped()) {
5987+
return getOriginalDeclarationType(expression); // GROOVY-9996
5988+
}
5989+
return getInferredTypeFromTempInfo(expression, getType(expression));
5990+
}
5991+
// GRECLIPSE end
5992+
59795993
private static ClassNode getDeclaringClass(MethodNode method, Expression arguments) {
59805994
ClassNode declaringClass = method.getDeclaringClass();
59815995

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

+14
Original file line numberDiff line numberDiff line change
@@ -5439,7 +5439,11 @@ protected ClassNode inferReturnTypeGenerics(final ClassNode receiver, final Meth
54395439
for (int i = 0; i < paramLength; i += 1) {
54405440
boolean lastArg = (i == paramLength - 1);
54415441
ClassNode paramType = parameters[i].getType();
5442+
/* GRECLIPSE edit -- GROOVY-9996
54425443
ClassNode argumentType = getType(expressions.get(i));
5444+
*/
5445+
ClassNode argumentType = getDeclaredOrInferredType(expressions.get(i));
5446+
// GRECLIPSE end
54435447
while (paramType.isArray() && argumentType.isArray()) {
54445448
paramType = paramType.getComponentType();
54455449
argumentType = argumentType.getComponentType();
@@ -5722,6 +5726,16 @@ private ClassNode resolveGenericsWithContext(final Map<GenericsTypeName, Generic
57225726
return resolveClassNodeGenerics(resolvedPlaceholders, placeholdersFromContext, currentType);
57235727
}
57245728

5729+
// GRECLIPSE add
5730+
private ClassNode getDeclaredOrInferredType(final Expression expression) {
5731+
// in case of "T t = new ExtendsOrImplementsT()", return T for the expression type
5732+
if (expression instanceof Variable && !((Variable) expression).isDynamicTyped()) {
5733+
return getOriginalDeclarationType(expression); // GROOVY-9996
5734+
}
5735+
return getInferredTypeFromTempInfo(expression, getType(expression));
5736+
}
5737+
// GRECLIPSE end
5738+
57255739
private static ClassNode getDeclaringClass(final MethodNode method, final Expression arguments) {
57265740
ClassNode declaringClass = method.getDeclaringClass();
57275741

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

+14
Original file line numberDiff line numberDiff line change
@@ -5405,7 +5405,11 @@ protected ClassNode inferReturnTypeGenerics(final ClassNode receiver, final Meth
54055405
for (int i = 0; i < paramLength; i += 1) {
54065406
boolean lastArg = (i == paramLength - 1);
54075407
ClassNode paramType = parameters[i].getType();
5408+
/* GRECLIPSE edit -- GROOVY-9996
54085409
ClassNode argumentType = getType(expressions.get(i));
5410+
*/
5411+
ClassNode argumentType = getDeclaredOrInferredType(expressions.get(i));
5412+
// GRECLIPSE end
54095413
while (paramType.isArray() && argumentType.isArray()) {
54105414
paramType = paramType.getComponentType();
54115415
argumentType = argumentType.getComponentType();
@@ -5672,6 +5676,16 @@ private ClassNode resolveGenericsWithContext(final Map<GenericsTypeName, Generic
56725676
return resolveClassNodeGenerics(resolvedPlaceholders, placeholdersFromContext, currentType);
56735677
}
56745678

5679+
// GRECLIPSE add
5680+
private ClassNode getDeclaredOrInferredType(final Expression expression) {
5681+
// in case of "T t = new ExtendsOrImplementsT()", return T for the expression type
5682+
if (expression instanceof Variable && !((Variable) expression).isDynamicTyped()) {
5683+
return getOriginalDeclarationType(expression); // GROOVY-9996
5684+
}
5685+
return getInferredTypeFromTempInfo(expression, getType(expression));
5686+
}
5687+
// GRECLIPSE end
5688+
56755689
private static ClassNode getDeclaringClass(final MethodNode method, final Expression arguments) {
56765690
ClassNode declaringClass = method.getDeclaringClass();
56775691

0 commit comments

Comments
 (0)