You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2021/04/10 21:48:24 UTC
[groovy] branch master updated: GROOVY-10011: STC: instanceof
refines declared type for diamond operator (closes #1545)
This is an automated email from the ASF dual-hosted git repository.
paulk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/master by this push:
new 131728f GROOVY-10011: STC: instanceof refines declared type for diamond operator (closes #1545)
131728f is described below
commit 131728feed3005173aee3fcff4f7a97b2ac78410
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Apr 6 08:59:31 2021 -0500
GROOVY-10011: STC: instanceof refines declared type for diamond operator (closes #1545)
---
.../transform/stc/StaticTypeCheckingVisitor.java | 8 ++++++--
src/test/groovy/transform/stc/GenericsSTCTest.groovy | 19 +++++++++++++++++++
2 files changed, 25 insertions(+), 2 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 4952cc1..9a35798 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -5546,11 +5546,15 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
}
private ClassNode getDeclaredOrInferredType(final Expression expression) {
+ ClassNode declaredOrInferred;
// in case of "T t = new ExtendsOrImplementsT()", return T for the expression type
if (expression instanceof Variable && !((Variable) expression).isDynamicTyped()) {
- return getOriginalDeclarationType(expression); // GROOVY-9996
+ declaredOrInferred = getOriginalDeclarationType(expression); // GROOVY-9996
+ } else {
+ declaredOrInferred = getType(expression);
}
- return getInferredTypeFromTempInfo(expression, getType(expression));
+ // GROOVY-10011: apply instanceof constraints to either option
+ return getInferredTypeFromTempInfo(expression, declaredOrInferred);
}
private static ClassNode getDeclaringClass(final MethodNode method, final Expression arguments) {
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index ac1f8a7..b6ecffb 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -343,6 +343,25 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
'''
}
+ // GROOVY-10011
+ void testDiamondInferrenceFromConstructor8b() {
+ assertScript '''
+ @groovy.transform.TupleConstructor(defaults=false)
+ class C<T> {
+ T p
+ }
+ interface I { }
+ class D implements I { }
+
+ void test(I i) {
+ if (i instanceof D) {
+ C<D> cd = new C<>(i)
+ }
+ }
+ test(new D())
+ '''
+ }
+
void testDiamondInferrenceFromConstructor9() {
assertScript '''
abstract class A<X> { }