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();