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 23:37:28 UTC
[groovy] 02/02: GROOVY-10011: STC: instanceof refines declared type
for diamond operator (closes #1545) (port to 3_0_X)
This is an automated email from the ASF dual-hosted git repository.
paulk pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 7b9297cfd639ba14225c99299700706cdd35381b
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) (port to 3_0_X)
---
.../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 e025180..49f5353 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -5447,11 +5447,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 b5020e3..be9319e 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -213,6 +213,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 testLinkedListWithListArgument() {
assertScript '''
List<String> list = new LinkedList<String>(['1','2','3'])