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
commit fb1cac6334a1d6f338b499bf21a541be20c36579 Author: Eric Milles <[email protected]> AuthorDate: Tue Nov 2 11:27:49 2021 -0500 GROOVY-10228: STC: diamond inference for method call's object expression --- .../transform/stc/StaticTypeCheckingVisitor.java | 37 +++++++++++++--------- .../groovy/transform/stc/GenericsSTCTest.groovy | 20 ++++++++++-- .../groovy/groovysh/util/PackageHelperImpl.groovy | 2 +- 3 files changed, 41 insertions(+), 18 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 e4b753d..e47de5d 100644 --- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java +++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java @@ -1106,22 +1106,26 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport { } } - private void adjustGenerics(final ClassNode from, final ClassNode to) { - GenericsType[] genericsTypes = from.getGenericsTypes(); - if (genericsTypes == null) { - // case of: def foo = new HashMap<>() - genericsTypes = to.redirect().getGenericsTypes(); - } - GenericsType[] copy = new GenericsType[genericsTypes.length]; - for (int i = 0; i < genericsTypes.length; i++) { - GenericsType genericsType = genericsTypes[i]; - copy[i] = new GenericsType( - wrapTypeIfNecessary(genericsType.getType()), - genericsType.getUpperBounds(), - genericsType.getLowerBound() - ); + private void adjustGenerics(final ClassNode source, final ClassNode target) { + GenericsType[] genericsTypes = source.getGenericsTypes(); + if (genericsTypes == null) { // Map foo = new HashMap<>() + genericsTypes = target.redirect().getGenericsTypes().clone(); + for (int i = 0, n = genericsTypes.length; i < n; i += 1) { + GenericsType gt = genericsTypes[i]; + // GROOVY-10055: handle diamond or raw + ClassNode cn = gt.getUpperBounds() != null + ? gt.getUpperBounds()[0] : gt.getType().redirect(); + genericsTypes[i] = cn.getPlainNodeReference().asGenericsType(); + } + } else { + genericsTypes = genericsTypes.clone(); + for (int i = 0, n = genericsTypes.length; i < n; i += 1) { + GenericsType gt = genericsTypes[i]; + genericsTypes[i] = new GenericsType(gt.getType(), + gt.getUpperBounds(), gt.getLowerBound()); + } } - to.setGenericsTypes(copy); + target.setGenericsTypes(genericsTypes); } /** @@ -3303,6 +3307,9 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport { call.getMethod().visit(this); ClassNode receiver = getType(objectExpression); + if (objectExpression instanceof ConstructorCallExpression) { // GROOVY-10228 + inferDiamondType((ConstructorCallExpression) objectExpression, receiver.getPlainNodeReference()); + } if (call.isSpreadSafe()) { // make sure receiver is array or collection then check element type if (!receiver.isArray() && !implementsInterfaceOrIsSubclassOf(receiver, Collection_TYPE)) { addStaticTypeError("Spread operator can only be used on collection types", objectExpression); diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy index 13b7d4c..c9d4477 100644 --- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy +++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy @@ -1000,9 +1000,25 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase { ''' } - // GROOVY-10323 + // GROOVY-10228 void testDiamondInferrenceFromConstructor18() { assertScript ''' + @groovy.transform.TupleConstructor(defaults=false) + class C<T> { + T p + } + def m(Number n) { + 'works' + } + def x = 12345 + x = m(new C<>(x).getP()) // Cannot find matching method + assert x == 'works' + ''' + } + + // GROOVY-10323 + void testDiamondInferrenceFromConstructor19() { + assertScript ''' class C<T> { } def <T,T> T m(C<T> c) { @@ -1012,7 +1028,7 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase { } // GROOVY-10324 - void testDiamondInferrenceFromConstructor19() { + void testDiamondInferrenceFromConstructor20() { assertScript ''' class C<T> { } diff --git a/subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/util/PackageHelperImpl.groovy b/subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/util/PackageHelperImpl.groovy index cd4e85b..490f5c7 100644 --- a/subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/util/PackageHelperImpl.groovy +++ b/subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/util/PackageHelperImpl.groovy @@ -246,7 +246,7 @@ Files.walkFileTree(fs.getPath('modules'), File urlFile = new File(URLDecoder.decode(url.file, 'UTF-8')) if (urlFile.isDirectory()) { - return new HashSet<>().tap { + return new HashSet<String>().tap { collectPackageNamesFromFolderRecursive(urlFile, '', it) } }
