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:32 UTC
[12/37] incubator-groovy git commit: CompilePhase support in macro
CompilePhase support in macro
Project: http://git-wip-us.apache.org/repos/asf/incubator-groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-groovy/commit/f0805101
Tree: http://git-wip-us.apache.org/repos/asf/incubator-groovy/tree/f0805101
Diff: http://git-wip-us.apache.org/repos/asf/incubator-groovy/diff/f0805101
Branch: refs/heads/master
Commit: f0805101fdf844a03ba556281e6ea5bc89a5d637
Parents: b28460b
Author: Sergey Egorov <bs...@gmail.com>
Authored: Thu Jul 3 22:57:35 2014 +0300
Committer: Sergei Egorov <bs...@gmail.com>
Committed: Mon Sep 28 14:32:05 2015 +0300
----------------------------------------------------------------------
.../groovy/macro/runtime/MacroBuilder.java | 16 +++++++--
.../macro/runtime/MacroGroovyMethods.java | 9 +++++
.../macro/transform/MacroInvocationTrap.java | 35 +++++++++-----------
.../test/groovy/groovy/SimpleMacroTest.groovy | 34 ++++++++++++++++++-
4 files changed, 71 insertions(+), 23 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/f0805101/subprojects/groovy-macro/src/main/java/org/codehaus/groovy/macro/runtime/MacroBuilder.java
----------------------------------------------------------------------
diff --git a/subprojects/groovy-macro/src/main/java/org/codehaus/groovy/macro/runtime/MacroBuilder.java b/subprojects/groovy-macro/src/main/java/org/codehaus/groovy/macro/runtime/MacroBuilder.java
index 2c66f3e..ae82081 100644
--- a/subprojects/groovy-macro/src/main/java/org/codehaus/groovy/macro/runtime/MacroBuilder.java
+++ b/subprojects/groovy-macro/src/main/java/org/codehaus/groovy/macro/runtime/MacroBuilder.java
@@ -39,14 +39,26 @@ import java.util.Map;
public enum MacroBuilder {
INSTANCE;
- @SuppressWarnings("unchecked")
+ public <T> T macro(String source, final Map<MacroSubstitutionKey, Closure<Expression>> context, Class<T> resultClass) {
+ return macro(false, source, context, resultClass);
+ }
+
public <T> T macro(boolean asIs, String source, final Map<MacroSubstitutionKey, Closure<Expression>> context, Class<T> resultClass) {
+ return macro(CompilePhase.CONVERSION, asIs, source, context, resultClass);
+ }
+
+ public <T> T macro(CompilePhase compilePhase, String source, final Map<MacroSubstitutionKey, Closure<Expression>> context, Class<T> resultClass) {
+ return macro(compilePhase, false, source, context, resultClass);
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T> T macro(CompilePhase compilePhase, boolean asIs, String source, final Map<MacroSubstitutionKey, Closure<Expression>> context, Class<T> resultClass) {
final String label = "__synthesized__label__" + System.currentTimeMillis() + "__:";
final String labelledSource = label + source;
final int linesOffset = 1;
final int columnsOffset = label.length() + 1; // +1 because of {
- List<ASTNode> nodes = (new AstBuilder()).buildFromString(CompilePhase.CONVERSION, true, labelledSource);
+ List<ASTNode> nodes = (new AstBuilder()).buildFromString(compilePhase, true, labelledSource);
for(ASTNode node : nodes) {
if (node instanceof BlockStatement) {
http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/f0805101/subprojects/groovy-macro/src/main/java/org/codehaus/groovy/macro/runtime/MacroGroovyMethods.java
----------------------------------------------------------------------
diff --git a/subprojects/groovy-macro/src/main/java/org/codehaus/groovy/macro/runtime/MacroGroovyMethods.java b/subprojects/groovy-macro/src/main/java/org/codehaus/groovy/macro/runtime/MacroGroovyMethods.java
index 578a11f..5c41c04 100644
--- a/subprojects/groovy-macro/src/main/java/org/codehaus/groovy/macro/runtime/MacroGroovyMethods.java
+++ b/subprojects/groovy-macro/src/main/java/org/codehaus/groovy/macro/runtime/MacroGroovyMethods.java
@@ -17,6 +17,7 @@ package org.codehaus.groovy.macro.runtime;
import groovy.lang.Closure;
import groovy.lang.DelegatesTo;
+import org.codehaus.groovy.control.CompilePhase;
/**
*
@@ -38,4 +39,12 @@ public class MacroGroovyMethods {
public static <T> T macro(Object self, boolean asIs, @DelegatesTo(MacroValuePlaceholder.class) Closure cl) {
return null;
}
+
+ public static <T> T macro(Object self, CompilePhase compilePhase, @DelegatesTo(MacroValuePlaceholder.class) Closure cl) {
+ return null;
+ }
+
+ public static <T> T macro(Object self, CompilePhase compilePhase, boolean asIs, @DelegatesTo(MacroValuePlaceholder.class) Closure cl) {
+ return null;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/f0805101/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 b082e8b..127fb4b 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
@@ -88,31 +88,26 @@ public class MacroInvocationTrap extends MethodInvocationTrap {
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 true;
- }
-
- ConstantExpression asIsConstantExpression = (ConstantExpression) firstArgument;
+ if(macroArgumentsExpressions.size() == 2 || macroArgumentsExpressions.size() == 3) {
+ Expression asIsArgumentExpression = macroArgumentsExpressions.get(macroArgumentsExpressions.size() - 2);
+ if((asIsArgumentExpression instanceof ConstantExpression)) {
+ ConstantExpression asIsConstantExpression = (ConstantExpression) asIsArgumentExpression;
+
+ if(!(asIsConstantExpression.getValue() instanceof Boolean)) {
+ addError("AsIs argument value should be boolean", asIsConstantExpression);
+ return true;
+ }
- if(!(asIsConstantExpression.getValue() instanceof Boolean)) {
- addError("AsIs argument value should be boolean", asIsConstantExpression);
- return true;
+ asIs = (Boolean) asIsConstantExpression.getValue();
}
-
- asIs = (Boolean) asIsConstantExpression.getValue();
}
- List<Expression> otherArgs = new ArrayList<Expression>();
- otherArgs.add(new ConstantExpression(asIs));
- otherArgs.add(new ConstantExpression(source));
- otherArgs.add(mapExpression);
- otherArgs.add(new ClassExpression(ClassHelper.makeWithoutCaching(MacroBuilder.getMacroValue(closureBlock, asIs).getClass(), false)));
+ macroArgumentsExpressions.remove(macroArgumentsExpressions.size() - 1);
+
+ macroArgumentsExpressions.add(new ConstantExpression(source));
+ macroArgumentsExpressions.add(mapExpression);
+ macroArgumentsExpressions.add(new ClassExpression(ClassHelper.makeWithoutCaching(MacroBuilder.getMacroValue(closureBlock, asIs).getClass(), false)));
- macroCall.setArguments(new ArgumentListExpression(otherArgs));
macroCall.setObjectExpression(new PropertyExpression(new ClassExpression(ClassHelper.makeWithoutCaching(MacroBuilder.class, false)), "INSTANCE"));
macroCall.setSpreadSafe(false);
macroCall.setSafe(false);
http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/f0805101/subprojects/groovy-macro/src/test/groovy/groovy/SimpleMacroTest.groovy
----------------------------------------------------------------------
diff --git a/subprojects/groovy-macro/src/test/groovy/groovy/SimpleMacroTest.groovy b/subprojects/groovy-macro/src/test/groovy/groovy/SimpleMacroTest.groovy
index ad9b15b..9a29fc3 100644
--- a/subprojects/groovy-macro/src/test/groovy/groovy/SimpleMacroTest.groovy
+++ b/subprojects/groovy-macro/src/test/groovy/groovy/SimpleMacroTest.groovy
@@ -21,6 +21,7 @@ import org.codehaus.groovy.ast.VariableScope
import org.codehaus.groovy.ast.builder.AstAssert
import org.codehaus.groovy.ast.expr.*
import org.codehaus.groovy.ast.stmt.*
+import org.codehaus.groovy.control.CompilePhase
import static org.codehaus.groovy.ast.expr.VariableExpression.*;
@@ -45,7 +46,7 @@ class SimpleMacroTest extends GroovyTestCase {
assertSyntaxTree(expected, result);
}
-
+
public void testAsIs() {
def expected = new BlockStatement([
new ExpressionStatement(new MethodCallExpression(THIS_EXPRESSION, "println", new ArgumentListExpression(new ConstantExpression("foo"))))
@@ -92,6 +93,37 @@ class SimpleMacroTest extends GroovyTestCase {
assertSyntaxTree(expected, result);
}
+
+ public void testCompilePhase() {
+
+ def result = macro(CompilePhase.FINALIZATION) {
+ println "foo"
+ println "bar"
+ }
+
+ def expected = new BlockStatement(
+ [
+ new ExpressionStatement(new MethodCallExpression(THIS_EXPRESSION, "println", new ArgumentListExpression(new ConstantExpression("foo")))),
+ // In FINALIZATION phase last println will be return statement
+ new ReturnStatement(new MethodCallExpression(THIS_EXPRESSION, "println", new ArgumentListExpression(new ConstantExpression("bar")))),
+ ] as List<Statement>,
+ new VariableScope()
+ )
+
+ assertSyntaxTree(expected, result);
+ }
+
+ public void testAsIsWithCompilePhase() {
+ def expected = new BlockStatement([
+ new ReturnStatement(new MethodCallExpression(THIS_EXPRESSION, "println", new ArgumentListExpression(new ConstantExpression("foo"))))
+ ] as List<Statement>, new VariableScope());
+
+ def result = macro(CompilePhase.FINALIZATION, true) {
+ println "foo"
+ }
+
+ assertSyntaxTree(expected, result);
+ }
protected void assertSyntaxTree(Object expected, Object result) {
AstAssert.assertSyntaxTree([expected], [result])