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, '''