Skip to content

Commit 131728f

Browse files
eric-millespaulk-asert
authored andcommitted
GROOVY-10011: STC: instanceof refines declared type for diamond operator (closes #1545)
1 parent d9a6e3a commit 131728f

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5546,11 +5546,15 @@ private ClassNode resolveGenericsWithContext(final Map<GenericsTypeName, Generic
55465546
}
55475547

55485548
private ClassNode getDeclaredOrInferredType(final Expression expression) {
5549+
ClassNode declaredOrInferred;
55495550
// in case of "T t = new ExtendsOrImplementsT()", return T for the expression type
55505551
if (expression instanceof Variable && !((Variable) expression).isDynamicTyped()) {
5551-
return getOriginalDeclarationType(expression); // GROOVY-9996
5552+
declaredOrInferred = getOriginalDeclarationType(expression); // GROOVY-9996
5553+
} else {
5554+
declaredOrInferred = getType(expression);
55525555
}
5553-
return getInferredTypeFromTempInfo(expression, getType(expression));
5556+
// GROOVY-10011: apply instanceof constraints to either option
5557+
return getInferredTypeFromTempInfo(expression, declaredOrInferred);
55545558
}
55555559

55565560
private static ClassNode getDeclaringClass(final MethodNode method, final Expression arguments) {

src/test/groovy/transform/stc/GenericsSTCTest.groovy

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,25 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
343343
'''
344344
}
345345

346+
// GROOVY-10011
347+
void testDiamondInferrenceFromConstructor8b() {
348+
assertScript '''
349+
@groovy.transform.TupleConstructor(defaults=false)
350+
class C<T> {
351+
T p
352+
}
353+
interface I { }
354+
class D implements I { }
355+
356+
void test(I i) {
357+
if (i instanceof D) {
358+
C<D> cd = new C<>(i)
359+
}
360+
}
361+
test(new D())
362+
'''
363+
}
364+
346365
void testDiamondInferrenceFromConstructor9() {
347366
assertScript '''
348367
abstract class A<X> { }

0 commit comments

Comments
 (0)