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])