--- ./src/main/org/codehaus/groovy/ast/stmt/StandardForStatement.java.orig 2004-04-06 19:34:39.000000000 +0400 +++ ./src/main/org/codehaus/groovy/ast/stmt/StandardForStatement.java 2004-04-06 19:16:16.000000000 +0400 @@ -0,0 +1,44 @@ +package org.codehaus.groovy.ast.stmt; + +import org.codehaus.groovy.ast.GroovyCodeVisitor; +import org.codehaus.groovy.ast.Type; +import org.codehaus.groovy.ast.expr.Expression; +import org.codehaus.groovy.ast.expr.BooleanExpression; + +public class StandardForStatement extends Statement { + private Expression[] init; + private BooleanExpression testExpression; + private Expression[] update; + private Statement loopBlock; + + public StandardForStatement(Expression[] init, + BooleanExpression testExpression, Expression[] update, + Statement loopBlock) + { + this.init = init; + this.testExpression = testExpression; + this.update = update; + this.loopBlock = loopBlock; + } + + public void visit(GroovyCodeVisitor visitor) { + visitor.visitStandardForLoop(this); + } + + public BooleanExpression getTestExpression() { + return testExpression; + } + + public Statement getLoopBlock() { + return loopBlock; + } + + public Expression[] getUpdateExpressions() { + return update; + } + + public Expression[] getInitExpressions() { + return init; + } + +} /// end of StandardForStatement --- ./src/main/org/codehaus/groovy/ast/CodeVisitorSupport.java.orig 2004-04-06 19:38:22.000000000 +0400 +++ ./src/main/org/codehaus/groovy/ast/CodeVisitorSupport.java 2004-04-06 21:21:13.000000000 +0400 @@ -83,6 +83,7 @@ import org.codehaus.groovy.ast.stmt.DoWhileStatement; import org.codehaus.groovy.ast.stmt.ExpressionStatement; import org.codehaus.groovy.ast.stmt.ForStatement; +import org.codehaus.groovy.ast.stmt.StandardForStatement; import org.codehaus.groovy.ast.stmt.IfStatement; import org.codehaus.groovy.ast.stmt.ReturnStatement; import org.codehaus.groovy.ast.stmt.Statement; @@ -113,6 +114,20 @@ forLoop.getCollectionExpression().visit(this); forLoop.getLoopBlock().visit(this); } + + public void visitStandardForLoop(StandardForStatement forLoop) { + Expression[] initExpressions = forLoop.getInitExpressions(); + Expression[] updateExpressions = forLoop.getUpdateExpressions(); + + for (int i = 0; i < initExpressions.length; ++i) { + initExpressions[i].visit(this); + } + forLoop.getTestExpression().visit(this); + for (int i = 0; i < updateExpressions.length; ++i) { + updateExpressions[i].visit(this); + } + forLoop.getLoopBlock().visit(this); + } public void visitWhileLoop(WhileStatement loop) { loop.getBooleanExpression().visit(this); --- ./src/main/org/codehaus/groovy/ast/GroovyCodeVisitor.java.orig 2004-04-06 19:38:32.000000000 +0400 +++ ./src/main/org/codehaus/groovy/ast/GroovyCodeVisitor.java 2004-04-06 16:50:28.000000000 +0400 @@ -60,6 +60,7 @@ //------------------------------------------------------------------------- public void visitBlockStatement(BlockStatement statement); public void visitForLoop(ForStatement forLoop); + public void visitStandardForLoop(StandardForStatement forLoop); public void visitWhileLoop(WhileStatement loop); public void visitDoWhileLoop(DoWhileStatement loop); public void visitIfElse(IfStatement ifElse); --- ./src/main/org/codehaus/groovy/classgen/ClassGenerator.java.orig 2004-04-06 19:35:58.000000000 +0400 +++ ./src/main/org/codehaus/groovy/classgen/ClassGenerator.java 2004-04-06 20:28:38.000000000 +0400 @@ -102,6 +102,7 @@ import org.codehaus.groovy.ast.stmt.DoWhileStatement; import org.codehaus.groovy.ast.stmt.ExpressionStatement; import org.codehaus.groovy.ast.stmt.ForStatement; +import org.codehaus.groovy.ast.stmt.StandardForStatement; import org.codehaus.groovy.ast.stmt.IfStatement; import org.codehaus.groovy.ast.stmt.ReturnStatement; import org.codehaus.groovy.ast.stmt.Statement; @@ -462,6 +463,45 @@ cv.visitLabel(scope.getBreakLabel()); popScope(); } + + public void visitStandardForLoop(StandardForStatement loop) { + onLineNumber(loop); + + Expression[] initExpressions = loop.getInitExpressions(); + for (int i = 0; i < initExpressions.length; ++i) { + initExpressions[i].visit(this); + //cv.visitInsn(POP); + } + + pushBlockScope(); + + Label breakLabel = scope.getBreakLabel(); + Label continueLabel = scope.getContinueLabel(); + Label l1 = new Label(); + + cv.visitJumpInsn(GOTO, l1); + + cv.visitLabel(continueLabel); + + Expression[] updateExpressions = loop.getUpdateExpressions(); + for (int i = 0; i < updateExpressions.length; ++i) { + updateExpressions[i].visit(this); + cv.visitInsn(POP); + } + + cv.visitLabel(l1); + + loop.getTestExpression().visit(this); + cv.visitJumpInsn(IFEQ, breakLabel); + + loop.getLoopBlock().visit(this); + + cv.visitJumpInsn(GOTO, continueLabel); + + cv.visitLabel(breakLabel); + + popScope(); + } public void visitWhileLoop(WhileStatement loop) { onLineNumber(loop); --- ./src/main/org/codehaus/groovy/syntax/parser/ASTBuilder.java.orig 2004-04-06 19:33:36.000000000 +0400 +++ ./src/main/org/codehaus/groovy/syntax/parser/ASTBuilder.java 2004-04-06 17:21:40.000000000 +0400 @@ -90,6 +90,7 @@ 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.StandardForStatement; import org.codehaus.groovy.ast.stmt.IfStatement; import org.codehaus.groovy.ast.stmt.ReturnStatement; import org.codehaus.groovy.ast.stmt.Statement; @@ -999,7 +1000,7 @@ * Processes the Reduction produced by Parser.forStatement(). */ - protected ForStatement forStatement( CSTNode reduction ) throws ParserException + protected Statement forStatement( CSTNode reduction ) throws ParserException { CSTNode header = reduction.get(1); Statement body = statementBody( reduction.get(2) ); @@ -1010,11 +1011,13 @@ if( header.getMeaning() == Types.UNKNOWN ) { - Expression[] init = expressions( header.get(1) ); - Expression test = expression( header.get(2) ); - Expression[] incr = expressions( header.get(3) ); + Expression[] init = expressions( header.get(1) ); + BooleanExpression test = new BooleanExpression( + expression(header.get(2))); + Expression[] update = expressions( header.get(3) ); - throw new GroovyBugError( "NOT YET IMPLEMENTED: standard for loop" ); + //throw new GroovyBugError( "NOT YET IMPLEMENTED: standard for loop" ); + return new StandardForStatement(init, test, update, body); }