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:42 UTC

[22/37] incubator-groovy git commit: ASTMatcher: Add support for for loop

ASTMatcher: Add support for for loop


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

Branch: refs/heads/master
Commit: 199187e1cd539eed62f1a00f70b4f5650c053255
Parents: 8c1f263
Author: Cedric Champeau <ce...@gmail.com>
Authored: Fri Oct 17 13:47:25 2014 +0200
Committer: Sergei Egorov <bs...@gmail.com>
Committed: Mon Sep 28 14:33:11 2015 +0300

----------------------------------------------------------------------
 .../groovy/macro/matcher/ASTMatcher.groovy      | 24 +++++++++++++++++++-
 .../groovy/macro/matcher/ASTMatcherTest.groovy  | 18 +++++++++++++++
 2 files changed, 41 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/199187e1/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/matcher/ASTMatcher.groovy
----------------------------------------------------------------------
diff --git a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/matcher/ASTMatcher.groovy b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/matcher/ASTMatcher.groovy
index d715737..7c3b68f 100644
--- a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/matcher/ASTMatcher.groovy
+++ b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/matcher/ASTMatcher.groovy
@@ -22,6 +22,7 @@ import org.codehaus.groovy.ast.expr.*
 import org.codehaus.groovy.ast.stmt.BlockStatement
 import org.codehaus.groovy.ast.stmt.EmptyStatement
 import org.codehaus.groovy.ast.stmt.ExpressionStatement
+import org.codehaus.groovy.ast.stmt.ForStatement
 import org.codehaus.groovy.ast.stmt.IfStatement
 import org.codehaus.groovy.ast.stmt.Statement
 import org.codehaus.groovy.classgen.BytecodeExpression
@@ -830,7 +831,12 @@ class ASTMatcher extends ClassCodeVisitorSupport {
 
     @Override
     public void visitClosureListExpression(final ClosureListExpression cle) {
-        super.visitClosureListExpression(cle);
+        doWithNode(ClosureListExpression, current) {
+            def exprs = cle.expressions
+            doWithNode(exprs.class, ((ClosureListExpression)current).expressions) {
+                visitListOfExpressions(exprs)
+            }
+        }
     }
 
     @Override
@@ -858,4 +864,20 @@ class ASTMatcher extends ClassCodeVisitorSupport {
             }
         }
     }
+
+    @Override
+    void visitForLoop(final ForStatement forLoop) {
+        doWithNode(ForStatement, current) {
+            visitStatement(forLoop)
+            def cur = (ForStatement) current
+            def col = forLoop.collectionExpression
+            def block = forLoop.loopBlock
+            doWithNode(col.class, cur.collectionExpression) {
+                col.visit(this)
+            }
+            doWithNode(block.class, cur.loopBlock) {
+                block.visit(this)
+            }
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/199187e1/subprojects/groovy-macro/src/test/groovy/org/codehaus/groovy/macro/matcher/ASTMatcherTest.groovy
----------------------------------------------------------------------
diff --git a/subprojects/groovy-macro/src/test/groovy/org/codehaus/groovy/macro/matcher/ASTMatcherTest.groovy b/subprojects/groovy-macro/src/test/groovy/org/codehaus/groovy/macro/matcher/ASTMatcherTest.groovy
index eec19b9..75ca21c 100644
--- a/subprojects/groovy-macro/src/test/groovy/org/codehaus/groovy/macro/matcher/ASTMatcherTest.groovy
+++ b/subprojects/groovy-macro/src/test/groovy/org/codehaus/groovy/macro/matcher/ASTMatcherTest.groovy
@@ -26,6 +26,7 @@ import org.codehaus.groovy.ast.expr.MethodPointerExpression
 import org.codehaus.groovy.ast.expr.StaticMethodCallExpression
 import org.codehaus.groovy.ast.expr.UnaryMinusExpression
 import org.codehaus.groovy.ast.expr.UnaryPlusExpression
+import org.codehaus.groovy.ast.stmt.ForStatement
 import org.codehaus.groovy.ast.stmt.IfStatement
 import org.codehaus.groovy.control.CompilePhase
 import org.codehaus.groovy.macro.transform.MacroClass
@@ -537,4 +538,21 @@ class ASTMatcherTest extends GroovyTestCase {
         assert ASTMatcher.matches(ast6, ast7)
         assert !ASTMatcher.matches(ast7, ast8)
     }
+
+    void testForLoop() {
+        def ast1 = macro { for (;;) {} }
+        def ast2 = macro { for (;;) {} }
+        def ast3 = macro { for (int i=0;i<10;i++) {} }
+        def ast4 = macro { for (long i=0;i<10;i++) {} }
+        def ast5 = macro { for (int i=0;i<100;i++) {} }
+        def ast6 = macro { for (int i=0;i<10;i++) { a } }
+        assert ast1 instanceof ForStatement
+        assert ASTMatcher.matches(ast1, ast1)
+        assert ASTMatcher.matches(ast1, ast2)
+        assert ASTMatcher.matches(ast2, ast1)
+        assert !ASTMatcher.matches(ast1, ast3)
+        assert !ASTMatcher.matches(ast3, ast4)
+        assert !ASTMatcher.matches(ast3, ast5)
+        assert !ASTMatcher.matches(ast3, ast6)
+    }
 }