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 2017/04/07 13:31:20 UTC

[37/50] [abbrv] groovy git commit: extract MacroCallTransformingVisitor

extract MacroCallTransformingVisitor


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

Branch: refs/heads/parrot
Commit: ada0e2cd5442ff4bdd8e14839a49987abb60e7a3
Parents: b4e68bd
Author: Sergei Egorov <se...@zeroturnaround.com>
Authored: Mon Mar 13 15:59:14 2017 +0200
Committer: paulk <pa...@asert.com.au>
Committed: Tue Mar 28 16:02:23 2017 +1000

----------------------------------------------------------------------
 .../transform/MacroCallTransformingVisitor.java | 100 +++++++++++++++++++
 .../macro/transform/MacroTransformation.java    |  86 +---------------
 2 files changed, 101 insertions(+), 85 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/ada0e2cd/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroCallTransformingVisitor.java
----------------------------------------------------------------------
diff --git a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroCallTransformingVisitor.java b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroCallTransformingVisitor.java
new file mode 100644
index 0000000..6af1afe
--- /dev/null
+++ b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroCallTransformingVisitor.java
@@ -0,0 +1,100 @@
+package org.codehaus.groovy.macro.transform;
+
+import org.codehaus.groovy.ast.*;
+import org.codehaus.groovy.ast.expr.*;
+import org.codehaus.groovy.classgen.asm.InvocationWriter;
+import org.codehaus.groovy.control.CompilationUnit;
+import org.codehaus.groovy.control.SourceUnit;
+import org.codehaus.groovy.macro.runtime.MacroContext;
+import org.codehaus.groovy.macro.runtime.MacroStub;
+import org.codehaus.groovy.runtime.InvokerHelper;
+import org.codehaus.groovy.transform.stc.ExtensionMethodNode;
+import org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport;
+
+import java.util.ArrayList;
+import java.util.List;
+
+class MacroCallTransformingVisitor extends ClassCodeVisitorSupport {
+
+    private static final ClassNode MACRO_CONTEXT_CLASS_NODE = ClassHelper.make(MacroContext.class);
+
+    private static final ClassNode MACRO_STUB_CLASS_NODE = ClassHelper.make(MacroStub.class);
+
+    private static final PropertyExpression MACRO_STUB_INSTANCE = new PropertyExpression(new ClassExpression(MACRO_STUB_CLASS_NODE), "INSTANCE");
+
+    private static final String MACRO_STUB_METHOD_NAME = "macroMethod";
+
+    private final SourceUnit sourceUnit;
+    private final CompilationUnit unit;
+    private final ClassLoader classLoader;
+
+    public MacroCallTransformingVisitor(SourceUnit sourceUnit, CompilationUnit unit) {
+        this.sourceUnit = sourceUnit;
+        this.unit = unit;
+        this.classLoader = unit.getTransformLoader();
+    }
+
+    @Override
+    protected SourceUnit getSourceUnit() {
+        return sourceUnit;
+    }
+
+    @Override
+    public void visitMethodCallExpression(MethodCallExpression call) {
+        super.visitMethodCallExpression(call);
+
+        List<MethodNode> methods = MacroMethodsCache.get(classLoader).get(call.getMethodAsString());
+
+        if (methods == null) {
+            // Not a macro call
+            return;
+        }
+
+        List<Expression> callArguments = InvocationWriter.makeArgumentList(call.getArguments()).getExpressions();
+
+        ClassNode[] argumentsList = new ClassNode[callArguments.size()];
+
+        for (int i = 0; i < callArguments.size(); i++) {
+            argumentsList[i] = ClassHelper.make(callArguments.get(i).getClass());
+        }
+
+        methods = StaticTypeCheckingSupport.chooseBestMethod(MACRO_CONTEXT_CLASS_NODE, methods, argumentsList);
+
+        for (MethodNode macroMethodNode : methods) {
+            if (!(macroMethodNode instanceof ExtensionMethodNode)) {
+                // TODO is it even possible?
+                continue;
+            }
+
+            MethodNode macroExtensionMethodNode = ((ExtensionMethodNode) macroMethodNode).getExtensionMethodNode();
+
+            final Class clazz;
+            try {
+                clazz = classLoader.loadClass(macroExtensionMethodNode.getDeclaringClass().getName());
+            } catch (ClassNotFoundException e) {
+                //TODO different reaction?
+                continue;
+            }
+
+            MacroContext macroContext = new MacroContext(unit, sourceUnit, call);
+
+            List<Object> macroArguments = new ArrayList<>();
+            macroArguments.add(macroContext);
+            macroArguments.addAll(callArguments);
+
+            Expression result = (Expression) InvokerHelper.invokeStaticMethod(clazz, macroMethodNode.getName(), macroArguments.toArray());
+
+            call.setObjectExpression(MACRO_STUB_INSTANCE);
+            call.setMethod(new ConstantExpression(MACRO_STUB_METHOD_NAME));
+
+            // TODO check that we reset everything here
+            call.setSpreadSafe(false);
+            call.setSafe(false);
+            call.setImplicitThis(false);
+            call.setArguments(result);
+            call.setGenericsTypes(new GenericsType[0]);
+
+            break;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/groovy/blob/ada0e2cd/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroTransformation.java
----------------------------------------------------------------------
diff --git a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroTransformation.java b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroTransformation.java
index 84e8d60..983ba18 100644
--- a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroTransformation.java
+++ b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroTransformation.java
@@ -20,20 +20,10 @@ package org.codehaus.groovy.macro.transform;
 
 import groovy.transform.CompilationUnitAware;
 import org.codehaus.groovy.ast.*;
-import org.codehaus.groovy.ast.expr.*;
-import org.codehaus.groovy.classgen.asm.InvocationWriter;
 import org.codehaus.groovy.control.CompilationUnit;
 import org.codehaus.groovy.control.CompilePhase;
 import org.codehaus.groovy.control.SourceUnit;
-import org.codehaus.groovy.macro.runtime.MacroContext;
-import org.codehaus.groovy.macro.runtime.MacroStub;
-import org.codehaus.groovy.runtime.InvokerHelper;
 import org.codehaus.groovy.transform.GroovyASTTransformation;
-import org.codehaus.groovy.transform.stc.ExtensionMethodNode;
-import org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport;
-
-import java.util.ArrayList;
-import java.util.List;
 
 /**
  * @author Sergei Egorov <bs...@gmail.com>
@@ -42,14 +32,6 @@ import java.util.List;
 @GroovyASTTransformation(phase = CompilePhase.CONVERSION)
 public class MacroTransformation extends MethodCallTransformation implements CompilationUnitAware {
 
-    private static final ClassNode MACRO_CONTEXT_CLASS_NODE = ClassHelper.make(MacroContext.class);
-
-    private static final ClassNode MACRO_STUB_CLASS_NODE = ClassHelper.make(MacroStub.class);
-
-    private static final PropertyExpression MACRO_STUB_INSTANCE = new PropertyExpression(new ClassExpression(MACRO_STUB_CLASS_NODE), "INSTANCE");
-
-    private static final String MACRO_STUB_METHOD_NAME = "macroMethod";
-
     protected CompilationUnit unit;
 
     @Override
@@ -59,72 +41,6 @@ public class MacroTransformation extends MethodCallTransformation implements Com
 
     @Override
     protected GroovyCodeVisitor getTransformer(ASTNode[] nodes, final SourceUnit sourceUnit) {
-        // Macro methods should on a classpath of the compiler because we invoke them during the compilation
-        final ClassLoader classLoader = this.getClass().getClassLoader();
-        return new ClassCodeVisitorSupport() {
-
-            @Override
-            protected SourceUnit getSourceUnit() {
-                return sourceUnit;
-            }
-
-            @Override
-            public void visitMethodCallExpression(MethodCallExpression call) {
-                super.visitMethodCallExpression(call);
-
-                List<MethodNode> methods = MacroMethodsCache.get(classLoader).get(call.getMethodAsString());
-
-                if (methods == null) {
-                    // Not a macro call
-                    return;
-                }
-
-                List<Expression> callArguments = InvocationWriter.makeArgumentList(call.getArguments()).getExpressions();
-
-                ClassNode[] argumentsList = new ClassNode[callArguments.size()];
-
-                for (int i = 0; i < callArguments.size(); i++) {
-                    argumentsList[i] = ClassHelper.make(callArguments.get(i).getClass());
-                }
-
-                methods = StaticTypeCheckingSupport.chooseBestMethod(MACRO_CONTEXT_CLASS_NODE, methods, argumentsList);
-
-                for (MethodNode macroMethodNode : methods) {
-                    if (!(macroMethodNode instanceof ExtensionMethodNode)) {
-                        // TODO is it even possible?
-                        continue;
-                    }
-
-                    MethodNode macroExtensionMethodNode = ((ExtensionMethodNode) macroMethodNode).getExtensionMethodNode();
-
-                    final Class clazz;
-                    try {
-                        clazz = classLoader.loadClass(macroExtensionMethodNode.getDeclaringClass().getName());
-                    } catch (ClassNotFoundException e) {
-                        //TODO different reaction?
-                        continue;
-                    }
-
-                    MacroContext macroContext = new MacroContext(unit, sourceUnit, call);
-
-                    List<Object> macroArguments = new ArrayList<>();
-                    macroArguments.add(macroContext);
-                    macroArguments.addAll(callArguments);
-
-                    Expression result = (Expression) InvokerHelper.invokeStaticMethod(clazz, macroMethodNode.getName(), macroArguments.toArray());
-
-                    call.setObjectExpression(MACRO_STUB_INSTANCE);
-                    call.setMethod(new ConstantExpression(MACRO_STUB_METHOD_NAME));
-
-                    // TODO check that we reset everything here
-                    call.setSpreadSafe(false);
-                    call.setSafe(false);
-                    call.setImplicitThis(false);
-                    call.setArguments(result);
-
-                    break;
-                }
-            }
-        };
+        return new MacroCallTransformingVisitor(sourceUnit, unit);
     }
 }