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);
}
}