This is an automated email from the ASF dual-hosted git repository.
emilles 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 db9ca93 GROOVY-8974: STC: missesGenericsTypes(ClassNode) true for
unresolved <>
db9ca93 is described below
commit db9ca932f4e20280ffd50f39cde7d54586215ea3
Author: Eric Milles <[email protected]>
AuthorDate: Sun May 2 09:29:12 2021 -0500
GROOVY-8974: STC: missesGenericsTypes(ClassNode) true for unresolved <>
---
.../groovy/transform/stc/StaticTypeCheckingSupport.java | 2 +-
.../groovy/transform/stc/StaticTypeCheckingVisitor.java | 7 +++----
src/test/groovy/transform/stc/GenericsSTCTest.groovy | 11 +++++++++++
3 files changed, 15 insertions(+), 5 deletions(-)
diff --git
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
index 287b72c..b71aed3 100644
---
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -2148,7 +2148,7 @@ public abstract class StaticTypeCheckingSupport {
while (cn.isArray()) cn = cn.getComponentType();
GenericsType[] cnGenerics = cn.getGenericsTypes();
GenericsType[] rnGenerics = cn.redirect().getGenericsTypes();
- return cnGenerics == null ? rnGenerics != null :
GenericsUtils.hasUnresolvedGenerics(cn);
+ return cnGenerics == null || cnGenerics.length == 0 ? rnGenerics !=
null : GenericsUtils.hasUnresolvedGenerics(cn);
}
/**
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 f520295..6893a97 100644
---
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -796,6 +796,9 @@ public class StaticTypeCheckingVisitor extends
ClassCodeVisitorSupport {
if (resultType == null) {
resultType = lType;
} else if (isAssignment(op)) {
+ if (rightExpression instanceof ConstructorCallExpression) {
+ inferDiamondType((ConstructorCallExpression)
rightExpression, lType);
+ }
if (lType.isUsingGenerics() &&
missesGenericsTypes(resultType)) {
// unchecked assignment
// List<Type> list = new LinkedList()
@@ -837,10 +840,6 @@ public class StaticTypeCheckingVisitor extends
ClassCodeVisitorSupport {
boolean isEmptyDeclaration = (expression instanceof
DeclarationExpression && rightExpression instanceof EmptyExpression);
if (!isEmptyDeclaration && isAssignment(op)) {
- if (rightExpression instanceof ConstructorCallExpression) {
- inferDiamondType((ConstructorCallExpression)
rightExpression, lType);
- }
-
ClassNode originType =
getOriginalDeclarationType(leftExpression);
typeCheckAssignment(expression, leftExpression, originType,
rightExpression, resultType);
// if assignment succeeds but result type is not a subtype of
original type, then we are in a special cast handling
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index 8aa76c3..c6a3b13 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -396,6 +396,17 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
'''
}
+ // GROOVY-8974
+ void testReturnTypeInferenceWithMethodGenerics12() {
+ assertScript '''
+ def <T> T identity(T t) { t }
+ List<String> list = identity(new ArrayList<>())
+ list.add('foo')
+ def foo = list[0]
+ assert foo.toUpperCase() == 'FOO'
+ '''
+ }
+
void testDiamondInferrenceFromConstructor1() {
assertScript '''
class Foo<U> {