Search in sources :

Example 1 with SemicolonTerminatedStatement

use of net.jangaroo.jooc.ast.SemicolonTerminatedStatement in project jangaroo-tools by CoreMedia.

the class JsCodeGenerator method visitForInStatement.

@Override
public void visitForInStatement(final ForInStatement forInStatement) throws IOException {
    final Ide exprAuxIde = forInStatement.getExprAuxIde();
    IdeDeclaration exprType = forInStatement.getExpr().getType();
    String exprTypeName = exprType != null ? exprType.getQualifiedNameStr() : "";
    boolean iterateArrayMode = "Array".equals(exprTypeName) || "Vector$object".equals(exprTypeName);
    if (exprAuxIde != null && !iterateArrayMode) {
        new SemicolonTerminatedStatement(new VariableDeclaration(SYM_VAR, exprAuxIde, null, null), SYM_SEMICOLON).visit(this);
    }
    out.writeSymbol(forInStatement.getSymKeyword());
    final boolean isForEach = forInStatement.getSymEach() != null;
    if (isForEach) {
        out.beginComment();
        out.writeSymbol(forInStatement.getSymEach());
        out.endComment();
    }
    out.writeSymbol(forInStatement.getLParen());
    if (isForEach || iterateArrayMode) {
        new VariableDeclaration(SYM_VAR, forInStatement.getAuxIde(), null, null).visit(this);
    } else {
        if (forInStatement.getDecl() != null) {
            forInStatement.getDecl().visit(this);
        } else {
            forInStatement.getLValue().visit(this);
        }
    }
    if (iterateArrayMode) {
        String indexVarName = forInStatement.getAuxIde().getName();
        out.write("=0");
        if (exprAuxIde != null) {
            out.write(",");
            out.writeToken(exprAuxIde.getName());
            out.writeToken("=");
            out.beginComment();
            out.writeSymbol(forInStatement.getSymIn());
            out.endComment();
            forInStatement.getExpr().visit(this);
        }
        out.write(";");
        out.write(indexVarName);
        out.write("<");
        if (exprAuxIde != null) {
            out.writeToken(exprAuxIde.getName());
        } else {
            out.beginComment();
            out.writeSymbol(forInStatement.getSymIn());
            out.endComment();
            forInStatement.getExpr().visit(this);
        }
        out.write(".length;");
        out.write("++" + indexVarName);
    } else {
        out.writeSymbol(forInStatement.getSymIn());
        if (exprAuxIde != null) {
            // assign the expression value to the auxiliary expression value variable once:
            out.writeToken(exprAuxIde.getName());
            out.writeToken("=");
        }
        forInStatement.getExpr().visit(this);
    }
    out.writeSymbol(forInStatement.getRParen());
    if (isForEach || iterateArrayMode) {
        // inject synthesized statement into loop body:
        if (!(forInStatement.getBody() instanceof BlockStatement)) {
            forInStatement.setBody(new BlockStatement(SYM_LBRACE, Arrays.<Directive>asList(forInStatement.getBody()), SYM_RBRACE));
        }
        ((BlockStatement) forInStatement.getBody()).addBlockStartCodeGenerator(new CodeGenerator() {

            @Override
            public void generate(JsWriter out, boolean first) throws IOException {
                // synthesize assigning the correct index to the variable given in the original for each statement:
                if (forInStatement.getDecl() != null) {
                    forInStatement.getDecl().visit(JsCodeGenerator.this);
                } else {
                    forInStatement.getLValue().visit(JsCodeGenerator.this);
                }
                out.writeToken("=");
                if (!isForEach) {
                    out.write("String(" + forInStatement.getAuxIde().getName() + ")");
                } else {
                    if (exprAuxIde == null) {
                        forInStatement.getExpr().visit(JsCodeGenerator.this);
                    } else {
                        out.write(exprAuxIde.getName());
                    }
                    out.write("[" + forInStatement.getAuxIde().getName() + "]");
                }
                out.write(";");
            }
        });
    }
    forInStatement.getBody().visit(this);
}
Also used : IdeDeclaration(net.jangaroo.jooc.ast.IdeDeclaration) TypedIdeDeclaration(net.jangaroo.jooc.ast.TypedIdeDeclaration) VariableDeclaration(net.jangaroo.jooc.ast.VariableDeclaration) BlockStatement(net.jangaroo.jooc.ast.BlockStatement) Ide(net.jangaroo.jooc.ast.Ide) NamespacedIde(net.jangaroo.jooc.ast.NamespacedIde) QualifiedIde(net.jangaroo.jooc.ast.QualifiedIde) CodeGenerator(net.jangaroo.jooc.CodeGenerator) IOException(java.io.IOException) SemicolonTerminatedStatement(net.jangaroo.jooc.ast.SemicolonTerminatedStatement) UseNamespaceDirective(net.jangaroo.jooc.ast.UseNamespaceDirective) Directive(net.jangaroo.jooc.ast.Directive) ImportDirective(net.jangaroo.jooc.ast.ImportDirective) JsWriter(net.jangaroo.jooc.JsWriter)

Aggregations

IOException (java.io.IOException)1 CodeGenerator (net.jangaroo.jooc.CodeGenerator)1 JsWriter (net.jangaroo.jooc.JsWriter)1 BlockStatement (net.jangaroo.jooc.ast.BlockStatement)1 Directive (net.jangaroo.jooc.ast.Directive)1 Ide (net.jangaroo.jooc.ast.Ide)1 IdeDeclaration (net.jangaroo.jooc.ast.IdeDeclaration)1 ImportDirective (net.jangaroo.jooc.ast.ImportDirective)1 NamespacedIde (net.jangaroo.jooc.ast.NamespacedIde)1 QualifiedIde (net.jangaroo.jooc.ast.QualifiedIde)1 SemicolonTerminatedStatement (net.jangaroo.jooc.ast.SemicolonTerminatedStatement)1 TypedIdeDeclaration (net.jangaroo.jooc.ast.TypedIdeDeclaration)1 UseNamespaceDirective (net.jangaroo.jooc.ast.UseNamespaceDirective)1 VariableDeclaration (net.jangaroo.jooc.ast.VariableDeclaration)1