You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2017/04/11 01:38:02 UTC

[26/50] groovy git commit: Make for loop statement conform to JLS further

Make for loop statement conform to JLS further


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

Branch: refs/heads/master
Commit: 35ec2156e3356f85a666c71ba3d3df3bf74c81ae
Parents: fd88412
Author: sunlan <su...@apache.org>
Authored: Sat Jan 28 21:39:32 2017 +0800
Committer: sunlan <su...@apache.org>
Committed: Sat Jan 28 21:39:32 2017 +0800

----------------------------------------------------------------------
 .../groovy/classgen/asm/StatementWriter.java    | 37 ++++++++++++++++--
 .../apache/groovy/parser/antlr4/AstBuilder.java |  7 ++--
 .../parser/antlr4/GroovyParserTest.groovy       |  1 +
 .../src/test/resources/core/For_04x.groovy      | 40 +++++++++++++++++---
 .../src/test/resources/core/For_05x.groovy      | 22 +++++++++++
 5 files changed, 94 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/35ec2156/src/main/org/codehaus/groovy/classgen/asm/StatementWriter.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/classgen/asm/StatementWriter.java b/src/main/org/codehaus/groovy/classgen/asm/StatementWriter.java
index 4ff1a99..c36916f 100644
--- a/src/main/org/codehaus/groovy/classgen/asm/StatementWriter.java
+++ b/src/main/org/codehaus/groovy/classgen/asm/StatementWriter.java
@@ -21,8 +21,31 @@ package org.codehaus.groovy.classgen.asm;
 import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.ast.Parameter;
-import org.codehaus.groovy.ast.expr.*;
-import org.codehaus.groovy.ast.stmt.*;
+import org.codehaus.groovy.ast.expr.ArgumentListExpression;
+import org.codehaus.groovy.ast.expr.BooleanExpression;
+import org.codehaus.groovy.ast.expr.ClosureListExpression;
+import org.codehaus.groovy.ast.expr.ConstantExpression;
+import org.codehaus.groovy.ast.expr.EmptyExpression;
+import org.codehaus.groovy.ast.expr.Expression;
+import org.codehaus.groovy.ast.expr.MethodCallExpression;
+import org.codehaus.groovy.ast.stmt.AssertStatement;
+import org.codehaus.groovy.ast.stmt.BlockStatement;
+import org.codehaus.groovy.ast.stmt.BreakStatement;
+import org.codehaus.groovy.ast.stmt.CaseStatement;
+import org.codehaus.groovy.ast.stmt.CatchStatement;
+import org.codehaus.groovy.ast.stmt.ContinueStatement;
+import org.codehaus.groovy.ast.stmt.DoWhileStatement;
+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.ReturnStatement;
+import org.codehaus.groovy.ast.stmt.Statement;
+import org.codehaus.groovy.ast.stmt.SwitchStatement;
+import org.codehaus.groovy.ast.stmt.SynchronizedStatement;
+import org.codehaus.groovy.ast.stmt.ThrowStatement;
+import org.codehaus.groovy.ast.stmt.TryCatchStatement;
+import org.codehaus.groovy.ast.stmt.WhileStatement;
 import org.codehaus.groovy.classgen.asm.CompileStack.BlockRecorder;
 import org.objectweb.asm.Label;
 import org.objectweb.asm.MethodVisitor;
@@ -137,7 +160,7 @@ public class StatementWriter {
         ClosureListExpression clExpr = (ClosureListExpression) loop.getCollectionExpression();
         controller.getCompileStack().pushVariableScope(clExpr.getVariableScope());
 
-        List expressions = clExpr.getExpressions();
+        List<Expression> expressions = clExpr.getExpressions();
         int size = expressions.size();
 
         // middle element is condition, lower half is init, higher half is increment
@@ -145,7 +168,13 @@ public class StatementWriter {
 
         // visit init
         for (int i = 0; i < condIndex; i++) {
-            visitExpressionOrStatement(expressions.get(i));
+            Expression expression = expressions.get(i);
+
+            if (expression instanceof ClosureListExpression) {
+                ((ClosureListExpression) expression).getExpressions().forEach(this::visitExpressionOrStatement);
+            } else {
+                visitExpressionOrStatement(expression);
+            }
         }
 
         Label continueLabel = controller.getCompileStack().getContinueLabel();

http://git-wip-us.apache.org/repos/asf/groovy/blob/35ec2156/subprojects/groovy-parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
----------------------------------------------------------------------
diff --git a/subprojects/groovy-parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java b/subprojects/groovy-parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
index 7f41d00..5ba04de 100644
--- a/subprojects/groovy-parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
+++ b/subprojects/groovy-parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
@@ -412,7 +412,6 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov
 
         if (asBoolean(ctx.localVariableDeclaration())) {
             DeclarationListStatement declarationListStatement = this.visitLocalVariableDeclaration(ctx.localVariableDeclaration());
-
             List<?> declarationExpressionList = declarationListStatement.getDeclarationExpressions();
 
             if (declarationExpressionList.size() == 1) {
@@ -423,7 +422,7 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov
         }
 
         if (asBoolean(ctx.expressionList())) {
-            return this.convertExpressionList(ctx.expressionList());
+            return this.translateExpressionList(ctx.expressionList());
         }
 
         throw createParsingFailedException("Unsupported for init: " + ctx.getText(), ctx);
@@ -435,10 +434,10 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov
             return EmptyExpression.INSTANCE;
         }
 
-        return this.convertExpressionList(ctx.expressionList());
+        return this.translateExpressionList(ctx.expressionList());
     }
 
-    private Expression convertExpressionList(ExpressionListContext ctx) {
+    private Expression translateExpressionList(ExpressionListContext ctx) {
         List<Expression> expressionList = this.visitExpressionList(ctx);
 
         if (expressionList.size() == 1) {

http://git-wip-us.apache.org/repos/asf/groovy/blob/35ec2156/subprojects/groovy-parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/GroovyParserTest.groovy
----------------------------------------------------------------------
diff --git a/subprojects/groovy-parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/GroovyParserTest.groovy b/subprojects/groovy-parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/GroovyParserTest.groovy
index 9c05273..65a9099 100644
--- a/subprojects/groovy-parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/GroovyParserTest.groovy
+++ b/subprojects/groovy-parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/GroovyParserTest.groovy
@@ -209,6 +209,7 @@ class GroovyParserTest extends GroovyTestCase {
         doTest('core/For_02.groovy');
         doTest('core/For_03.groovy');
         doRunAndTest('core/For_04x.groovy');
+        doRunAndTest('core/For_05x.groovy');
     }
 
     void "test groovy core - While"() {

http://git-wip-us.apache.org/repos/asf/groovy/blob/35ec2156/subprojects/groovy-parser-antlr4/src/test/resources/core/For_04x.groovy
----------------------------------------------------------------------
diff --git a/subprojects/groovy-parser-antlr4/src/test/resources/core/For_04x.groovy b/subprojects/groovy-parser-antlr4/src/test/resources/core/For_04x.groovy
index cdad5fc..1afb389 100644
--- a/subprojects/groovy-parser-antlr4/src/test/resources/core/For_04x.groovy
+++ b/subprojects/groovy-parser-antlr4/src/test/resources/core/For_04x.groovy
@@ -1,6 +1,36 @@
-int result = 0
-for ((i, j) = [0, 0]; i < 5 && j < 5; i = i + 2, j++) {
-    result += i;
-    result += j;
+import groovy.transform.CompileStatic
+
+@CompileStatic
+def testCS() {
+    int result = 0
+    for (def (int i, int j) = [0, 0]; i < 5 && j < 5; i = i + 2, j++) {
+        result += i;
+        result += j;
+    }
+    assert 9 == result
+
+    result = 0
+    for (int i = 0, j = 0; i < 5 && j < 5; i = i + 2, j++) {
+        result += i;
+        result += j;
+    }
+    assert 9 == result
 }
-assert 9 == result
+testCS()
+
+def test() {
+    int result = 0
+    for ((i, j) = [0, 0]; i < 5 && j < 5; i = i + 2, j++) {
+        result += i;
+        result += j;
+    }
+    assert 9 == result
+
+    result = 0
+    for (int i = 0, j = 0; i < 5 && j < 5; i = i + 2, j++) {
+        result += i;
+        result += j;
+    }
+    assert 9 == result
+}
+test()

http://git-wip-us.apache.org/repos/asf/groovy/blob/35ec2156/subprojects/groovy-parser-antlr4/src/test/resources/core/For_05x.groovy
----------------------------------------------------------------------
diff --git a/subprojects/groovy-parser-antlr4/src/test/resources/core/For_05x.groovy b/subprojects/groovy-parser-antlr4/src/test/resources/core/For_05x.groovy
new file mode 100644
index 0000000..fe55805
--- /dev/null
+++ b/subprojects/groovy-parser-antlr4/src/test/resources/core/For_05x.groovy
@@ -0,0 +1,22 @@
+import groovy.transform.CompileStatic
+
+@CompileStatic
+def testCS() {
+    int result = 0
+    for (int i = 0, n = 5; i < n; i++) {
+        result += i
+    }
+
+    assert 10 == result
+}
+testCS();
+
+def test() {
+    int result = 0
+    for (int i = 0, n = 5; i < n; i++) {
+        result += i
+    }
+
+    assert 10 == result
+}
+test();