Skip to content

Commit d6c6b54

Browse files
committed
GROOVY-10011
1 parent d486c94 commit d6c6b54

File tree

4 files changed

+41
-9
lines changed

4 files changed

+41
-9
lines changed

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

+23
Original file line numberDiff line numberDiff line change
@@ -2069,4 +2069,27 @@ public void testTypeChecked10010a() {
20692069
"Groovy:[Static type checking] - You are trying to use a GString in place of a String in a type which explicitly declares accepting String. Make sure to call toString() on all GString values.\n" +
20702070
"----------\n");
20712071
}
2072+
2073+
@Test
2074+
public void testTypeChecked10011() {
2075+
//@formatter:off
2076+
String[] sources = {
2077+
"Main.groovy",
2078+
"@groovy.transform.TupleConstructor(defaults=false)\n" +
2079+
"class C<T> {\n" +
2080+
" T p\n" +
2081+
"}\n" +
2082+
"interface I { }\n" +
2083+
"class D implements I { }\n" +
2084+
"@groovy.transform.TypeChecked\n" +
2085+
"void test(I i) {\n" +
2086+
" if (i instanceof D)\n" +
2087+
" C<D> cd = new C<>(i)\n" +
2088+
"}\n" +
2089+
"test(new D())\n",
2090+
};
2091+
//@formatter:on
2092+
2093+
runConformTest(sources, "");
2094+
}
20722095
}

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

+6-3
Original file line numberDiff line numberDiff line change
@@ -6147,13 +6147,16 @@ private ClassNode resolveGenericsWithContext(Map<GenericsTypeName, GenericsType>
61476147
return resolveClassNodeGenerics(resolvedPlaceholders, placeholdersFromContext, currentType);
61486148
}
61496149

6150-
// GRECLIPSE add
6150+
// GRECLIPSE add -- GROOVY-9996, GROOVY-10011
61516151
private ClassNode getDeclaredOrInferredType(final Expression expression) {
6152+
ClassNode declaredOrInferred;
61526153
// in case of "T t = new ExtendsOrImplementsT()", return T for the expression type
61536154
if (expression instanceof Variable && !((Variable) expression).isDynamicTyped()) {
6154-
return getOriginalDeclarationType(expression); // GROOVY-9996
6155+
declaredOrInferred = getOriginalDeclarationType(expression);
6156+
} else {
6157+
declaredOrInferred = getType(expression);
61556158
}
6156-
return getInferredTypeFromTempInfo(expression, getType(expression));
6159+
return getInferredTypeFromTempInfo(expression, declaredOrInferred);
61576160
}
61586161
// GRECLIPSE end
61596162

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

+6-3
Original file line numberDiff line numberDiff line change
@@ -5914,13 +5914,16 @@ private ClassNode resolveGenericsWithContext(final Map<GenericsTypeName, Generic
59145914
return resolveClassNodeGenerics(resolvedPlaceholders, placeholdersFromContext, currentType);
59155915
}
59165916

5917-
// GRECLIPSE add
5917+
// GRECLIPSE add -- GROOVY-9996, GROOVY-10011
59185918
private ClassNode getDeclaredOrInferredType(final Expression expression) {
5919+
ClassNode declaredOrInferred;
59195920
// in case of "T t = new ExtendsOrImplementsT()", return T for the expression type
59205921
if (expression instanceof Variable && !((Variable) expression).isDynamicTyped()) {
5921-
return getOriginalDeclarationType(expression); // GROOVY-9996
5922+
declaredOrInferred = getOriginalDeclarationType(expression);
5923+
} else {
5924+
declaredOrInferred = getType(expression);
59225925
}
5923-
return getInferredTypeFromTempInfo(expression, getType(expression));
5926+
return getInferredTypeFromTempInfo(expression, declaredOrInferred);
59245927
}
59255928
// GRECLIPSE end
59265929

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

+6-3
Original file line numberDiff line numberDiff line change
@@ -5862,13 +5862,16 @@ private ClassNode resolveGenericsWithContext(final Map<GenericsTypeName, Generic
58625862
return resolveClassNodeGenerics(resolvedPlaceholders, placeholdersFromContext, currentType);
58635863
}
58645864

5865-
// GRECLIPSE add
5865+
// GRECLIPSE add -- GROOVY-9996, GROOVY-10011
58665866
private ClassNode getDeclaredOrInferredType(final Expression expression) {
5867+
ClassNode declaredOrInferred;
58675868
// in case of "T t = new ExtendsOrImplementsT()", return T for the expression type
58685869
if (expression instanceof Variable && !((Variable) expression).isDynamicTyped()) {
5869-
return getOriginalDeclarationType(expression); // GROOVY-9996
5870+
declaredOrInferred = getOriginalDeclarationType(expression);
5871+
} else {
5872+
declaredOrInferred = getType(expression);
58705873
}
5871-
return getInferredTypeFromTempInfo(expression, getType(expression));
5874+
return getInferredTypeFromTempInfo(expression, declaredOrInferred);
58725875
}
58735876
// GRECLIPSE end
58745877

0 commit comments

Comments
 (0)