You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2022/09/06 14:17:22 UTC

[groovy] branch GROOVY_2_5_X updated: GROOVY-9963: resolve ctor call diamond for attribute/property expression

This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch GROOVY_2_5_X
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/GROOVY_2_5_X by this push:
     new 9e037dbb6f GROOVY-9963: resolve ctor call diamond for attribute/property expression
9e037dbb6f is described below

commit 9e037dbb6f6ed7203af3bd5d25133464b2452ba6
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon May 16 14:13:34 2022 -0500

    GROOVY-9963: resolve ctor call diamond for attribute/property expression
---
 .../transform/stc/StaticTypeCheckingVisitor.java   |  5 +++-
 .../groovy/transform/stc/GenericsSTCTest.groovy    | 34 ++++++++++++----------
 2 files changed, 22 insertions(+), 17 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 545e9ad736..b11de5b7eb 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -1474,7 +1474,10 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
         if (propertyName == null) return false;
 
         Expression objectExpression = pexp.getObjectExpression();
-        ClassNode objectExpressionType = getType(objectExpression);
+        ClassNode  objectExpressionType = getType(objectExpression);
+        if (objectExpression instanceof ConstructorCallExpression) { // GROOVY-9963
+            inferDiamondType((ConstructorCallExpression) objectExpression, objectExpressionType);
+        }
         List<ClassNode> enclosingTypes = typeCheckingContext.getEnclosingClassNodes();
         boolean staticOnlyAccess = isClassClassNodeWrappingConcreteType(objectExpressionType);
         if ("this".equals(propertyName) && staticOnlyAccess) {
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index 0f05adc431..a03dc9801c 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -18,6 +18,7 @@
  */
 package groovy.transform.stc
 
+import groovy.test.GroovyAssert
 import groovy.transform.NotYetImplemented
 import org.codehaus.groovy.tools.javac.JavaAwareCompilationUnit
 
@@ -285,7 +286,7 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
     }
 
     // GROOVY-10098
-    void testReturnTypeInferenceWithMethodGenerics16() {
+    void testReturnTypeInferenceWithMethodGenerics17() {
         assertScript '''
             @groovy.transform.TupleConstructor(defaults=false)
             class C<T extends Number> {
@@ -301,9 +302,10 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
 
     // GROOVY-10749
     void testReturnTypeInferenceWithMethodGenerics29() {
-        String named = 'class Named { String name }'
+        if (!GroovyAssert.isAtLeastJdk('1.8')) return
 
-        assertScript named + '''
+        assertScript '''
+            class Named { String name }
             @ASTTest(phase=INSTRUCTION_SELECTION, value={
                 def type = node.getNodeMetaData(INFERRED_TYPE)
                 assert type.toString(false) == 'java.util.stream.Collector <Named, ?, java.util.Map>'
@@ -588,7 +590,7 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
         'Incompatible generic argument types. Cannot assign C<? extends java.lang.Object> to: C<D>'
     }
 
-    @NotYetImplemented // GROOVY-9963
+    // GROOVY-9963
     void testDiamondInferrenceFromConstructor10() {
         assertScript '''
             @groovy.transform.TupleConstructor(defaults=false)
@@ -1653,7 +1655,7 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
     }
 
     // GROOVY-9945
-    void testShouldUseMethodGenericType7() {
+    void testShouldUseMethodGenericType9() {
         assertScript '''
             interface I<T> {
             }
@@ -1671,6 +1673,12 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
 
     // GROOVY-8409, GROOVY-9915, GROOVY-10745
     void testShouldUseMethodGenericType10() {
+        if (GroovyAssert.isAtLeastJdk('1.8')) {
+            assertScript '''
+                Map map() { [:] }
+                Optional.of(map()).orElse(Collections.emptyMap())
+            '''
+        }
         assertScript '''
             interface OngoingStubbing<T> /*extends IOngoingStubbing*/ {
                 // type parameter from enclosing type in signature:
@@ -1688,21 +1696,14 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
 
             when(foo()).thenReturn(Optional.empty())
         '''
-
-        if (!groovy.test.GroovyAssert.isAtLeastJdk('1.8')) return
-
-        assertScript '''
-            Map map() { [:] }
-            Optional.of(map()).orElse(Collections.emptyMap());
-        '''
     }
 
-    @NotYetImplemented // GROOVY-8409, GROOVY-9902
+    // GROOVY-8409, GROOVY-9902
     void testShouldUseMethodGenericType11() {
-        File parentDir = File.createTempDir()
+        File parentDir = createTempDir()
         config.with {
-            targetDirectory = File.createTempDir()
-            jointCompilationOptions = [memStub: true]
+            targetDirectory = createTempDir()
+            jointCompilationOptions = [stubDir: createTempDir()]
         }
         try {
             def a = new File(parentDir, 'Main.groovy')
@@ -1738,6 +1739,7 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
         } finally {
             parentDir.deleteDir()
             config.targetDirectory.deleteDir()
+            config.jointCompilationOptions.stubDir.deleteDir()
         }
     }