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 2023/04/11 19:48:02 UTC

[groovy] branch GROOVY_4_0_X updated: GROOVY-11001: SC: proper call site writer for constructor ref in closure

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

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


The following commit(s) were added to refs/heads/GROOVY_4_0_X by this push:
     new 1a975c2233 GROOVY-11001: SC: proper call site writer for constructor ref in closure
1a975c2233 is described below

commit 1a975c2233d48a16bbfc41458fee5ef89bd8a24f
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Apr 11 14:06:22 2023 -0500

    GROOVY-11001: SC: proper call site writer for constructor ref in closure
---
 .../asm/sc/StaticTypesWriterController.java        | 21 ++++-----------------
 .../transform/stc/MethodReferenceTest.groovy       | 22 ++++++++++++++++++++++
 2 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesWriterController.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesWriterController.java
index b05dbe2386..5a7e216c77 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesWriterController.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesWriterController.java
@@ -18,8 +18,6 @@
  */
 package org.codehaus.groovy.classgen.asm.sc;
 
-import org.codehaus.groovy.ast.AnnotatedNode;
-import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.ast.ConstructorNode;
 import org.codehaus.groovy.ast.MethodNode;
@@ -39,11 +37,11 @@ import org.codehaus.groovy.classgen.asm.UnaryExpressionHelper;
 import org.codehaus.groovy.classgen.asm.WriterController;
 import org.codehaus.groovy.classgen.asm.indy.sc.IndyStaticTypesMultiTypeDispatcher;
 import org.codehaus.groovy.control.CompilerConfiguration;
-import org.codehaus.groovy.transform.sc.StaticCompilationMetadataKeys;
-import org.codehaus.groovy.transform.sc.StaticCompilationVisitor;
 import org.codehaus.groovy.transform.stc.StaticTypesMarker;
 import org.objectweb.asm.ClassVisitor;
 
+import static org.codehaus.groovy.transform.sc.StaticCompilationVisitor.isStaticallyCompiled;
+
 /**
  * An alternative {@link org.codehaus.groovy.classgen.asm.WriterController} which handles static types and method
  * dispatch. In case of a "mixed mode" where only some methods are annotated with {@link groovy.transform.TypeChecked}
@@ -87,24 +85,13 @@ public class StaticTypesWriterController extends DelegatingController {
 
     @Override
     public void setMethodNode(final MethodNode mn) {
-        updateStaticCompileFlag(mn);
+        isInStaticallyCheckedMethod = isStaticallyCompiled(mn);
         super.setMethodNode(mn);
     }
 
-    private void updateStaticCompileFlag(final MethodNode mn) {
-        AnnotatedNode outer = mn;
-        ClassNode classNode = getClassNode();
-        boolean inClosureOrLambda = ClassHelper.isGeneratedFunction(classNode);
-        if (inClosureOrLambda) {
-            outer = classNode.getOuterClass();
-        }
-        boolean isStaticCompileNode = Boolean.TRUE.equals(classNode.getNodeMetaData(StaticCompilationMetadataKeys.STATIC_COMPILE_NODE));
-        isInStaticallyCheckedMethod = mn != null && (StaticCompilationVisitor.isStaticallyCompiled(outer) || inClosureOrLambda && isStaticCompileNode);
-    }
-
     @Override
     public void setConstructorNode(final ConstructorNode cn) {
-        updateStaticCompileFlag(cn);
+        isInStaticallyCheckedMethod = isStaticallyCompiled(cn);
         super.setConstructorNode(cn);
     }
 
diff --git a/src/test/groovy/transform/stc/MethodReferenceTest.groovy b/src/test/groovy/transform/stc/MethodReferenceTest.groovy
index 0cfde16a90..5d9e22aa34 100644
--- a/src/test/groovy/transform/stc/MethodReferenceTest.groovy
+++ b/src/test/groovy/transform/stc/MethodReferenceTest.groovy
@@ -675,6 +675,28 @@ final class MethodReferenceTest {
         '''
     }
 
+    @Test // class::new -- GROOVY-11001
+    void testFunctionCN6() {
+        assertScript shell, '''
+            @Grab('io.vavr:vavr:0.10.4')
+            import io.vavr.control.Try
+
+            class StringInputStream {
+                StringInputStream(String s) {
+                }
+            }
+
+            @CompileStatic
+            void test() {
+                Try.success('string').flatMap { // <U> Try<U> flatMap(Function<? super T,? extends Try<? extends U>> mapper)
+                    Try.success(it).map(StringInputStream::new)
+                }
+            }
+
+            test()
+        '''
+    }
+
     @Test // arrayClass::new
     void testIntFunctionCN() {
         assertScript shell, '''