Repository: groovy
Updated Branches:
  refs/heads/native-lambda dbcac60f6 -> 37dc84543


Make `CorrectAccessedVariableVisitor` extends `CodeVisitorSupport`


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

Branch: refs/heads/native-lambda
Commit: 37dc8454315615d8f02609d50c0a5ce935e36cab
Parents: dbcac60
Author: sunlan <sun...@apache.org>
Authored: Wed Jan 31 17:17:10 2018 +0800
Committer: sunlan <sun...@apache.org>
Committed: Wed Jan 31 17:17:10 2018 +0800

----------------------------------------------------------------------
 .../groovy/classgen/asm/ClosureWriter.java      | 10 +----
 .../asm/sc/StaticTypesLambdaWriter.java         | 17 +++++++-
 src/test/groovy/transform/stc/LambdaTest.groovy | 44 ++++++++++++++++++++
 3 files changed, 61 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/37dc8454/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java 
b/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java
index 343b714..7c44599 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java
@@ -19,9 +19,9 @@
 package org.codehaus.groovy.classgen.asm;
 
 import org.codehaus.groovy.GroovyBugError;
-import org.codehaus.groovy.ast.ClassCodeVisitorSupport;
 import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.ClassNode;
+import org.codehaus.groovy.ast.CodeVisitorSupport;
 import org.codehaus.groovy.ast.ConstructorNode;
 import org.codehaus.groovy.ast.FieldNode;
 import org.codehaus.groovy.ast.InnerClassNode;
@@ -44,7 +44,6 @@ import org.codehaus.groovy.ast.stmt.ExpressionStatement;
 import org.codehaus.groovy.ast.stmt.ReturnStatement;
 import org.codehaus.groovy.classgen.AsmClassGenerator;
 import org.codehaus.groovy.classgen.Verifier;
-import org.codehaus.groovy.control.SourceUnit;
 import org.objectweb.asm.MethodVisitor;
 
 import java.util.HashMap;
@@ -332,7 +331,7 @@ public class ClosureWriter {
                 + controller.getContext().getNextClosureInnerName(outerClass, 
classNode, methodNode);
     }
 
-    protected static class CorrectAccessedVariableVisitor extends 
ClassCodeVisitorSupport {
+    protected static class CorrectAccessedVariableVisitor extends 
CodeVisitorSupport {
         private InnerClassNode icn;
 
         public CorrectAccessedVariableVisitor(InnerClassNode icn) {
@@ -350,11 +349,6 @@ public class ClosureWriter {
                 expression.setAccessedVariable(fn);
             }
         }
-
-        @Override
-        protected SourceUnit getSourceUnit() {
-            return null;
-        }
     }
 
     private static void correctAccessedVariable(final InnerClassNode 
closureClass, ClosureExpression ce) {

http://git-wip-us.apache.org/repos/asf/groovy/blob/37dc8454/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 a1a797c..60f8f7d 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
@@ -20,6 +20,7 @@
 package org.codehaus.groovy.classgen.asm.sc;
 
 import org.codehaus.groovy.GroovyBugError;
+import org.codehaus.groovy.ast.ClassCodeVisitorSupport;
 import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.ast.ConstructorNode;
@@ -39,6 +40,7 @@ import org.codehaus.groovy.classgen.asm.LambdaWriter;
 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.stc.StaticTypesMarker;
 import org.objectweb.asm.Handle;
 import org.objectweb.asm.MethodVisitor;
@@ -410,15 +412,21 @@ java.lang.ArrayIndexOutOfBoundsException: size==0
         return staticTypesClosureWriter.createClosureClass(expression, mods);
     }
 
-    private static final class TransformationVisitor extends 
CorrectAccessedVariableVisitor {
+    private static final class TransformationVisitor extends 
ClassCodeVisitorSupport {
+        private CorrectAccessedVariableVisitor correctAccessedVariableVisitor;
         private Parameter enclosingThisParameter;
 
         public TransformationVisitor(InnerClassNode icn, Parameter 
enclosingThisParameter) {
-            super(icn);
+            correctAccessedVariableVisitor = new 
CorrectAccessedVariableVisitor(icn);
             this.enclosingThisParameter = enclosingThisParameter;
         }
 
         @Override
+        public void visitVariableExpression(VariableExpression expression) {
+            correctAccessedVariableVisitor.visitVariableExpression(expression);
+        }
+
+        @Override
         public void visitMethodCallExpression(MethodCallExpression call) {
             if (!call.getMethodTarget().isStatic()) {
                 Expression objectExpression = call.getObjectExpression();
@@ -437,5 +445,10 @@ java.lang.ArrayIndexOutOfBoundsException: size==0
 
             super.visitMethodCallExpression(call);
         }
+
+        @Override
+        protected SourceUnit getSourceUnit() {
+            return null;
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/groovy/blob/37dc8454/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 560ab77..9bf9774 100644
--- a/src/test/groovy/transform/stc/LambdaTest.groovy
+++ b/src/test/groovy/transform/stc/LambdaTest.groovy
@@ -444,6 +444,27 @@ TestScript0.groovy: 14: [Static type checking] - Cannot 
find matching method jav
         '''
     }
 
+    void testFunctionCall3() {
+        assertScript '''
+        import groovy.transform.CompileStatic
+        import java.util.stream.Collectors
+        import java.util.stream.Stream
+        import java.util.function.Function
+        
+        @CompileStatic
+        public class Test1 {
+            public static void main(String[] args) {
+                p();
+            }
+        
+            public static void p() {
+                Function<Integer, Integer> f = (Integer e) -> (Integer) (e + 
1) // Casting is required...  [Static type checking] - Incompatible generic 
argument types. Cannot assign java.util.function.Function <java.lang.Integer, 
int> to: java.util.function.Function <Integer, Integer>
+                assert 2 == f.apply(1)
+            }
+        }
+        '''
+    }
+
     void testConsumerCall() {
         assertScript '''
         import groovy.transform.CompileStatic
@@ -490,6 +511,29 @@ TestScript0.groovy: 14: [Static type checking] - Cannot 
find matching method jav
         '''
     }
 
+    void testConsumerCall3() {
+        assertScript '''
+        import groovy.transform.CompileStatic
+        import java.util.stream.Collectors
+        import java.util.stream.Stream
+        import java.util.function.Consumer
+        
+        @CompileStatic
+        public class Test1 {
+            public static void main(String[] args) {
+                p();
+            }
+        
+            public static void p() {
+                int r = 1
+                Consumer<Integer> c = (Integer e) -> { r += e }
+                c.accept(2)
+                assert 3 == r
+            }
+        }
+        '''
+    }
+
     void testFunctionWithUpdatingLocalVariable() {
         assertScript '''
         import groovy.transform.CompileStatic

Reply via email to