You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by cc...@apache.org on 2015/10/07 21:26:24 UTC
[04/37] incubator-groovy git commit: shared code between MacroGroovy
and AstBuilderTransformation
shared code between MacroGroovy and AstBuilderTransformation
Project: http://git-wip-us.apache.org/repos/asf/incubator-groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-groovy/commit/df5fa06e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-groovy/tree/df5fa06e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-groovy/diff/df5fa06e
Branch: refs/heads/master
Commit: df5fa06ee6ce3212a4c98b6cae13c6c4a6b6dec5
Parents: 2056035
Author: Sergey Egorov <bs...@gmail.com>
Authored: Thu Jul 3 12:45:29 2014 +0300
Committer: Sergei Egorov <bs...@gmail.com>
Committed: Mon Sep 28 14:32:04 2015 +0300
----------------------------------------------------------------------
.../macro/transform/MacroInvocationTrap.java | 148 ++++++-------------
.../macro/transform/MacroTransformation.java | 41 +----
2 files changed, 54 insertions(+), 135 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/df5fa06e/subprojects/groovy-macro/src/main/java/org/codehaus/groovy/macro/transform/MacroInvocationTrap.java
----------------------------------------------------------------------
diff --git a/subprojects/groovy-macro/src/main/java/org/codehaus/groovy/macro/transform/MacroInvocationTrap.java b/subprojects/groovy-macro/src/main/java/org/codehaus/groovy/macro/transform/MacroInvocationTrap.java
index 7ac10df..b082e8b 100644
--- a/subprojects/groovy-macro/src/main/java/org/codehaus/groovy/macro/transform/MacroInvocationTrap.java
+++ b/subprojects/groovy-macro/src/main/java/org/codehaus/groovy/macro/transform/MacroInvocationTrap.java
@@ -15,18 +15,15 @@
*/
package org.codehaus.groovy.macro.transform;
-import org.codehaus.groovy.ast.ASTNode;
import org.codehaus.groovy.ast.ClassHelper;
import org.codehaus.groovy.ast.CodeVisitorSupport;
+import org.codehaus.groovy.ast.MethodInvocationTrap;
import org.codehaus.groovy.ast.expr.*;
import org.codehaus.groovy.ast.stmt.BlockStatement;
-import org.codehaus.groovy.ast.tools.ClosureUtils;
import org.codehaus.groovy.control.SourceUnit;
import org.codehaus.groovy.control.io.ReaderSource;
-import org.codehaus.groovy.control.messages.SyntaxErrorMessage;
import org.codehaus.groovy.macro.runtime.MacroBuilder;
import org.codehaus.groovy.macro.runtime.MacroSubstitutionKey;
-import org.codehaus.groovy.syntax.SyntaxException;
import java.util.ArrayList;
import java.util.List;
@@ -37,106 +34,73 @@ import static org.codehaus.groovy.ast.expr.VariableExpression.THIS_EXPRESSION;
*
* @author Sergei Egorov <bs...@gmail.com>
*/
-public class MacroInvocationTrap {
-
- private final ReaderSource source;
- private final SourceUnit sourceUnit;
-
- /**
- * Creates the trap and captures all macro method calls.
- *
- * @param source the reader source that contains source for the SourceUnit
- * @param sourceUnit the source unit being compiled. Used for error messages.
- */
- MacroInvocationTrap(ReaderSource source, SourceUnit sourceUnit) {
- if (source == null) throw new IllegalArgumentException("Null: source");
- if (sourceUnit == null) throw new IllegalArgumentException("Null: sourceUnit");
- this.source = source;
- this.sourceUnit = sourceUnit;
- }
+public class MacroInvocationTrap extends MethodInvocationTrap {
- /**
- * Reports an error back to the source unit.
- *
- * @param msg the error message
- * @param expr the expression that caused the error message.
- */
- private void addError(String msg, ASTNode expr) {
- sourceUnit.getErrorCollector().addErrorAndContinue(
- new SyntaxErrorMessage(new SyntaxException(msg + '\n', expr.getLineNumber(), expr.getColumnNumber(), expr.getLastLineNumber(), expr.getLastColumnNumber()), sourceUnit)
- );
+ public MacroInvocationTrap(ReaderSource source, SourceUnit sourceUnit) {
+ super(source, sourceUnit);
}
- /**
- * Attempts to find 'macro' invocations. When found, converts them into calls
- * to the 'from string' approach.
- *
- * @param macroCall the method call expression that may or may not be a 'macro' invocation.
- */
- public void visitMethodCallExpression(final MethodCallExpression macroCall) {
-
- if (!isBuildInvocation(macroCall, MacroTransformation.MACRO_METHOD)) {
- return;
- }
-
+ @Override
+ protected boolean handleTargetMethodCallExpression(MethodCallExpression macroCall) {
final ClosureExpression closureExpression = getClosureArgument(macroCall);
-
+
if(closureExpression == null) {
- return;
+ return true;
}
if(closureExpression.getParameters() != null && closureExpression.getParameters().length > 0) {
addError("Macro closure arguments are not allowed", closureExpression);
+ return true;
}
-
+
final MapExpression mapExpression = new MapExpression();
-
+
(new CodeVisitorSupport() {
@Override
public void visitMethodCallExpression(MethodCallExpression call) {
super.visitMethodCallExpression(call);
-
+
if(isBuildInvocation(call, MacroTransformation.DOLLAR_VALUE)) {
ClosureExpression substitutionClosureExpression = getClosureArgument(call);
-
+
if(substitutionClosureExpression == null) {
return;
}
MacroSubstitutionKey key = new MacroSubstitutionKey(call, closureExpression.getLineNumber(), closureExpression.getColumnNumber());
-
+
mapExpression.addMapEntryExpression(key.toConstructorCallExpression(), substitutionClosureExpression);
}
}
}).visitClosureExpression(closureExpression);
-
- String source = convertClosureToSource(this.source, closureExpression);
+
+ String source = convertClosureToSource(closureExpression);
BlockStatement closureBlock = (BlockStatement) closureExpression.getCode();
-
+
Boolean asIs = false;
-
+
TupleExpression macroArguments = getMacroArguments(macroCall);
-
+
if(macroArguments == null) {
- return;
+ return true;
}
List<Expression> macroArgumentsExpressions = macroArguments.getExpressions();
-
+
if(macroArgumentsExpressions.size() > 1) {
Expression firstArgument = macroArgumentsExpressions.get(0);
-
+
if(!(firstArgument instanceof ConstantExpression)) {
addError("AsIs argument value should be constant(true or false)", firstArgument);
- return;
+ return true;
}
-
+
ConstantExpression asIsConstantExpression = (ConstantExpression) firstArgument;
-
+
if(!(asIsConstantExpression.getValue() instanceof Boolean)) {
addError("AsIs argument value should be boolean", asIsConstantExpression);
- return;
+ return true;
}
asIs = (Boolean) asIsConstantExpression.getValue();
@@ -153,6 +117,29 @@ public class MacroInvocationTrap {
macroCall.setSpreadSafe(false);
macroCall.setSafe(false);
macroCall.setImplicitThis(false);
+
+ return true;
+ }
+
+ @Override
+ protected boolean isBuildInvocation(MethodCallExpression call) {
+ return isBuildInvocation(call, MacroTransformation.MACRO_METHOD);
+ }
+
+ public static boolean isBuildInvocation(MethodCallExpression call, String methodName) {
+ if (call == null) throw new IllegalArgumentException("Null: call");
+ if(methodName == null) throw new IllegalArgumentException("Null: methodName");
+
+ if(!(call.getMethod() instanceof ConstantExpression)) {
+ return false;
+ }
+
+ if(!(methodName.equals(call.getMethodAsString()))) {
+ return false;
+ }
+
+ // is method object correct type?
+ return call.getObjectExpression() == THIS_EXPRESSION;
}
protected TupleExpression getMacroArguments(MethodCallExpression call) {
@@ -193,41 +180,4 @@ public class MacroInvocationTrap {
return (ClosureExpression) result;
}
-
- /**
- * Looks for 'macro' method calls.
- *
- * @param call the method call expression, may not be null
- */
- public static boolean isBuildInvocation(MethodCallExpression call, String methodName) {
- if (call == null) throw new IllegalArgumentException("Null: call");
- if(methodName == null) throw new IllegalArgumentException("Null: methodName");
-
- if(!(call.getMethod() instanceof ConstantExpression)) {
- return false;
- }
-
- if(!(methodName.equals(call.getMethodAsString()))) {
- return false;
- }
-
- // is method object correct type?
- return call.getObjectExpression() == THIS_EXPRESSION;
- }
-
- /**
- * Converts a ClosureExpression into the String source.
- *
- * @param expression a closure
- * @return the source the closure was created from
- */
- private String convertClosureToSource(ReaderSource source, ClosureExpression expression) {
-
- try {
- return ClosureUtils.convertClosureToSource(source, expression);
- } catch (Exception e) {
- addError(e.getMessage(), expression);
- }
- return null;
- }
}
http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/df5fa06e/subprojects/groovy-macro/src/main/java/org/codehaus/groovy/macro/transform/MacroTransformation.java
----------------------------------------------------------------------
diff --git a/subprojects/groovy-macro/src/main/java/org/codehaus/groovy/macro/transform/MacroTransformation.java b/subprojects/groovy-macro/src/main/java/org/codehaus/groovy/macro/transform/MacroTransformation.java
index cdf0f07..65284b5 100644
--- a/subprojects/groovy-macro/src/main/java/org/codehaus/groovy/macro/transform/MacroTransformation.java
+++ b/subprojects/groovy-macro/src/main/java/org/codehaus/groovy/macro/transform/MacroTransformation.java
@@ -15,56 +15,25 @@
*/
package org.codehaus.groovy.macro.transform;
-import org.codehaus.groovy.ast.ASTNode;
-import org.codehaus.groovy.ast.ClassCodeVisitorSupport;
-import org.codehaus.groovy.ast.ClassNode;
-import org.codehaus.groovy.ast.ModuleNode;
-import org.codehaus.groovy.ast.expr.MethodCallExpression;
+import org.codehaus.groovy.ast.*;
import org.codehaus.groovy.control.CompilePhase;
import org.codehaus.groovy.control.SourceUnit;
-import org.codehaus.groovy.transform.ASTTransformation;
import org.codehaus.groovy.transform.GroovyASTTransformation;
/**
*
* @author Sergei Egorov <bs...@gmail.com>
*/
+
@GroovyASTTransformation(phase = CompilePhase.CONVERSION)
-public class MacroTransformation extends ClassCodeVisitorSupport implements ASTTransformation {
+public class MacroTransformation extends MethodCallTransformation {
public static final String DOLLAR_VALUE = "$v";
public static final String MACRO_METHOD = "macro";
- SourceUnit source;
-
- MacroInvocationTrap transformer;
-
- public void visit(ASTNode[] nodes, SourceUnit source) {
- this.source = source;
-
- transformer = new MacroInvocationTrap(source.getSource(), source);
-
- for(ASTNode node : nodes) {
- if(node instanceof ClassNode) {
- visitClass((ClassNode) node);
- } else if(node instanceof ModuleNode) {
- ModuleNode moduleNode = (ModuleNode) node;
- for (ClassNode classNode : moduleNode.getClasses()) {
- visitClass(classNode);
- }
- }
- }
- }
-
- @Override
- public void visitMethodCallExpression(MethodCallExpression call) {
- transformer.visitMethodCallExpression(call);
- super.visitMethodCallExpression(call);
- }
-
@Override
- protected SourceUnit getSourceUnit() {
- return source;
+ protected GroovyCodeVisitor getTransformer(ASTNode[] nodes, SourceUnit sourceUnit) {
+ return new MacroInvocationTrap(sourceUnit.getSource(), sourceUnit);
}
}