You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2018/03/08 11:32:37 UTC

groovy git commit: GROOVY-8493: Native lambdas with @CompileStatic at method level

Repository: groovy
Updated Branches:
  refs/heads/master 9ede855f3 -> 3f41484e5


GROOVY-8493: Native lambdas with @CompileStatic at method level


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/3f41484e
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/3f41484e
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/3f41484e

Branch: refs/heads/master
Commit: 3f41484e512a196149b9ec26e39958a436df56c4
Parents: 9ede855
Author: sunlan <su...@apache.org>
Authored: Thu Mar 8 19:32:31 2018 +0800
Committer: sunlan <su...@apache.org>
Committed: Thu Mar 8 19:32:31 2018 +0800

----------------------------------------------------------------------
 .../codehaus/groovy/classgen/asm/MopWriter.java  |  2 +-
 .../classgen/asm/sc/StaticTypesLambdaWriter.java |  2 ++
 .../asm/sc/StaticTypesWriterController.java      |  5 +++--
 src/test/groovy/transform/stc/LambdaTest.groovy  | 19 +++++++++++++++++++
 4 files changed, 25 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/3f41484e/src/main/java/org/codehaus/groovy/classgen/asm/MopWriter.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/MopWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/MopWriter.java
index 0781108..fff65d1 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/MopWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/MopWriter.java
@@ -86,7 +86,7 @@ public class MopWriter {
     
     public void createMopMethods() {
         ClassNode classNode = controller.getClassNode();
-        if (classNode.declaresInterface(ClassHelper.GENERATED_CLOSURE_Type)) {
+        if (classNode.declaresInterface(ClassHelper.GENERATED_CLOSURE_Type) || classNode.declaresInterface(ClassHelper.GENERATED_LAMBDA_TYPE)) {
             return;
         }
         Set<MopKey> currentClassSignatures = buildCurrentClassSignatureSet(classNode.getMethods());

http://git-wip-us.apache.org/repos/asf/groovy/blob/3f41484e/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesLambdaWriter.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesLambdaWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesLambdaWriter.java
index d9453ae..335945e 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesLambdaWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesLambdaWriter.java
@@ -40,6 +40,7 @@ import org.codehaus.groovy.classgen.asm.OperandStack;
 import org.codehaus.groovy.classgen.asm.WriterController;
 import org.codehaus.groovy.classgen.asm.WriterControllerFactory;
 import org.codehaus.groovy.control.SourceUnit;
+import org.codehaus.groovy.transform.sc.StaticCompilationMetadataKeys;
 import org.codehaus.groovy.transform.stc.StaticTypesMarker;
 import org.objectweb.asm.Handle;
 import org.objectweb.asm.MethodVisitor;
@@ -279,6 +280,7 @@ public class StaticTypesLambdaWriter extends LambdaWriter {
             lambdaClass.addInterface(ClassHelper.GENERATED_LAMBDA_TYPE);
             lambdaClass.putNodeMetaData(WriterControllerFactory.class, factory);
         }
+        lambdaClass.putNodeMetaData(StaticCompilationMetadataKeys.STATIC_COMPILE_NODE, Boolean.TRUE);
         return lambdaClass;
     }
 

http://git-wip-us.apache.org/repos/asf/groovy/blob/3f41484e/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesWriterController.java
----------------------------------------------------------------------
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 15943e5..5ce784a 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
@@ -94,13 +94,14 @@ public class StaticTypesWriterController extends DelegatingController {
     private void updateStaticCompileFlag(final MethodNode mn) {
         ClassNode classNode = getClassNode();
         AnnotatedNode node = mn;
-        if (classNode.implementsInterface(ClassHelper.GENERATED_CLOSURE_Type)) {
+        boolean implementsGeneratedClosureOrGeneratedLambdaInterface = classNode.implementsInterface(ClassHelper.GENERATED_CLOSURE_Type) || classNode.implementsInterface(ClassHelper.GENERATED_LAMBDA_TYPE);
+        if (implementsGeneratedClosureOrGeneratedLambdaInterface) {
             node = classNode.getOuterClass();
         }
 
         isInStaticallyCheckedMethod = mn != null && (
                 StaticCompilationVisitor.isStaticallyCompiled(node)
-                        || classNode.implementsInterface(ClassHelper.GENERATED_CLOSURE_Type)&&classNode.getNodeMetaData(StaticCompilationMetadataKeys.STATIC_COMPILE_NODE)!=null);
+                        || implementsGeneratedClosureOrGeneratedLambdaInterface && classNode.getNodeMetaData(StaticCompilationMetadataKeys.STATIC_COMPILE_NODE) != null);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/groovy/blob/3f41484e/src/test/groovy/transform/stc/LambdaTest.groovy
----------------------------------------------------------------------
diff --git a/src/test/groovy/transform/stc/LambdaTest.groovy b/src/test/groovy/transform/stc/LambdaTest.groovy
index a24e3c1..6ffd42e 100644
--- a/src/test/groovy/transform/stc/LambdaTest.groovy
+++ b/src/test/groovy/transform/stc/LambdaTest.groovy
@@ -41,6 +41,25 @@ class LambdaTest extends GroovyTestCase {
         '''
     }
 
+    void testFunction2() {
+        assertScript '''
+        import groovy.transform.CompileStatic
+        import java.util.stream.Collectors
+        import java.util.stream.Stream
+        
+        public class Test1 {
+            public static void main(String[] args) {
+                p();
+            }
+        
+            @CompileStatic
+            public static void p() {
+                assert [2, 3, 4] == [1, 2, 3].stream().map(e -> e.plus 1).collect(Collectors.toList());
+            }
+        }
+        '''
+    }
+
     void testFunctionScript() {
         assertScript '''
         import groovy.transform.CompileStatic