Search in sources :

Example 1 with LabeledStatement

use of com.google.devtools.j2objc.ast.LabeledStatement in project j2objc by google.

the class RewriterTest method testLabeledBreak.

public void testLabeledBreak() throws IOException {
    List<Statement> stmts = translateStatements("int i = 0; outer: for (; i < 10; i++) { " + "for (int j = 0; j < 10; j++) { break outer; }}");
    assertEquals(3, stmts.size());
    Statement s = stmts.get(1);
    // not LabeledStatement
    assertTrue(s instanceof ForStatement);
    ForStatement fs = (ForStatement) s;
    Statement forStmt = fs.getBody();
    assertTrue(forStmt instanceof Block);
    assertEquals(1, ((Block) forStmt).getStatements().size());
    Statement lastStmt = stmts.get(2);
    assertTrue(lastStmt instanceof LabeledStatement);
    assertTrue(((LabeledStatement) lastStmt).getBody() instanceof EmptyStatement);
}
Also used : LabeledStatement(com.google.devtools.j2objc.ast.LabeledStatement) ForStatement(com.google.devtools.j2objc.ast.ForStatement) IfStatement(com.google.devtools.j2objc.ast.IfStatement) LabeledStatement(com.google.devtools.j2objc.ast.LabeledStatement) EmptyStatement(com.google.devtools.j2objc.ast.EmptyStatement) Statement(com.google.devtools.j2objc.ast.Statement) EmptyStatement(com.google.devtools.j2objc.ast.EmptyStatement) Block(com.google.devtools.j2objc.ast.Block) ForStatement(com.google.devtools.j2objc.ast.ForStatement)

Example 2 with LabeledStatement

use of com.google.devtools.j2objc.ast.LabeledStatement in project j2objc by google.

the class RewriterTest method testLabeledContinue.

public void testLabeledContinue() throws IOException {
    List<Statement> stmts = translateStatements("int i = 0; outer: for (; i < 10; i++) { " + "for (int j = 0; j < 10; j++) { continue outer; }}");
    assertEquals(2, stmts.size());
    Statement s = stmts.get(1);
    // not LabeledStatement
    assertTrue(s instanceof ForStatement);
    ForStatement fs = (ForStatement) s;
    Statement forStmt = fs.getBody();
    assertTrue(forStmt instanceof Block);
    stmts = ((Block) forStmt).getStatements();
    assertEquals(2, stmts.size());
    Statement lastStmt = stmts.get(1);
    assertTrue(lastStmt instanceof LabeledStatement);
    assertTrue(((LabeledStatement) lastStmt).getBody() instanceof EmptyStatement);
}
Also used : LabeledStatement(com.google.devtools.j2objc.ast.LabeledStatement) ForStatement(com.google.devtools.j2objc.ast.ForStatement) IfStatement(com.google.devtools.j2objc.ast.IfStatement) LabeledStatement(com.google.devtools.j2objc.ast.LabeledStatement) EmptyStatement(com.google.devtools.j2objc.ast.EmptyStatement) Statement(com.google.devtools.j2objc.ast.Statement) EmptyStatement(com.google.devtools.j2objc.ast.EmptyStatement) Block(com.google.devtools.j2objc.ast.Block) ForStatement(com.google.devtools.j2objc.ast.ForStatement)

Example 3 with LabeledStatement

use of com.google.devtools.j2objc.ast.LabeledStatement in project j2objc by google.

the class RewriterTest method testLabeledBreakWithNonBlockParent.

public void testLabeledBreakWithNonBlockParent() throws IOException {
    List<Statement> stmts = translateStatements("int i = 0; if (i == 0) outer: for (; i < 10; i++) { " + "for (int j = 0; j < 10; j++) { break outer; }}");
    assertEquals(2, stmts.size());
    Statement s = stmts.get(1);
    assertTrue(s instanceof IfStatement);
    s = ((IfStatement) s).getThenStatement();
    assertTrue(s instanceof Block);
    stmts = ((Block) s).getStatements();
    assertEquals(2, stmts.size());
    s = stmts.get(0);
    // not LabeledStatement
    assertTrue(s instanceof ForStatement);
    ForStatement fs = (ForStatement) s;
    Statement forStmt = fs.getBody();
    assertTrue(forStmt instanceof Block);
    assertEquals(1, ((Block) forStmt).getStatements().size());
    Statement labelStmt = stmts.get(1);
    assertTrue(labelStmt instanceof LabeledStatement);
    assertTrue(((LabeledStatement) labelStmt).getBody() instanceof EmptyStatement);
}
Also used : IfStatement(com.google.devtools.j2objc.ast.IfStatement) LabeledStatement(com.google.devtools.j2objc.ast.LabeledStatement) ForStatement(com.google.devtools.j2objc.ast.ForStatement) IfStatement(com.google.devtools.j2objc.ast.IfStatement) LabeledStatement(com.google.devtools.j2objc.ast.LabeledStatement) EmptyStatement(com.google.devtools.j2objc.ast.EmptyStatement) Statement(com.google.devtools.j2objc.ast.Statement) EmptyStatement(com.google.devtools.j2objc.ast.EmptyStatement) Block(com.google.devtools.j2objc.ast.Block) ForStatement(com.google.devtools.j2objc.ast.ForStatement)

Example 4 with LabeledStatement

use of com.google.devtools.j2objc.ast.LabeledStatement in project j2objc by google.

the class LabelRewriter method endVisit.

@Override
public void endVisit(LabeledStatement node) {
    Statement loopBody = getLoopBody(node.getBody());
    final String labelIdentifier = node.getLabel().getIdentifier();
    final boolean[] hasContinue = new boolean[1];
    final boolean[] hasBreak = new boolean[1];
    node.accept(new TreeVisitor() {

        @Override
        public void endVisit(ContinueStatement node) {
            if (node.getLabel() != null && node.getLabel().getIdentifier().equals(labelIdentifier)) {
                hasContinue[0] = true;
                node.setLabel(new SimpleName("continue_" + labelIdentifier));
            }
        }

        @Override
        public void endVisit(BreakStatement node) {
            if (node.getLabel() != null && node.getLabel().getIdentifier().equals(labelIdentifier)) {
                hasBreak[0] = true;
                node.setLabel(new SimpleName("break_" + labelIdentifier));
            }
        }
    });
    if (hasContinue[0]) {
        assert loopBody != null : "Continue statements must be inside a loop.";
        LabeledStatement newLabelStmt = new LabeledStatement("continue_" + labelIdentifier);
        newLabelStmt.setBody(new EmptyStatement());
        // Put the loop body into an inner block so the continue label is outside
        // the scope of any variable initializations.
        Block newBlock = new Block();
        loopBody.replaceWith(newBlock);
        newBlock.addStatement(loopBody);
        newBlock.addStatement(newLabelStmt);
    }
    if (hasBreak[0]) {
        LabeledStatement newLabelStmt = new LabeledStatement("break_" + labelIdentifier);
        newLabelStmt.setBody(new EmptyStatement());
        TreeUtil.insertAfter(node, newLabelStmt);
    }
    if (hasContinue[0] || hasBreak[0]) {
        // Replace this node with its statement, thus deleting the label.
        node.replaceWith(TreeUtil.remove(node.getBody()));
    }
}
Also used : TreeVisitor(com.google.devtools.j2objc.ast.TreeVisitor) BreakStatement(com.google.devtools.j2objc.ast.BreakStatement) LabeledStatement(com.google.devtools.j2objc.ast.LabeledStatement) Statement(com.google.devtools.j2objc.ast.Statement) ContinueStatement(com.google.devtools.j2objc.ast.ContinueStatement) ForStatement(com.google.devtools.j2objc.ast.ForStatement) DoStatement(com.google.devtools.j2objc.ast.DoStatement) EnhancedForStatement(com.google.devtools.j2objc.ast.EnhancedForStatement) LabeledStatement(com.google.devtools.j2objc.ast.LabeledStatement) WhileStatement(com.google.devtools.j2objc.ast.WhileStatement) BreakStatement(com.google.devtools.j2objc.ast.BreakStatement) EmptyStatement(com.google.devtools.j2objc.ast.EmptyStatement) SimpleName(com.google.devtools.j2objc.ast.SimpleName) EmptyStatement(com.google.devtools.j2objc.ast.EmptyStatement) Block(com.google.devtools.j2objc.ast.Block) ContinueStatement(com.google.devtools.j2objc.ast.ContinueStatement)

Example 5 with LabeledStatement

use of com.google.devtools.j2objc.ast.LabeledStatement in project j2objc by google.

the class LabelRewriter method visit.

@Override
public boolean visit(MethodDeclaration node) {
    // Rename any labels that have the same names; legal in Java but not C.
    final Map<String, Integer> labelCounts = new HashMap<>();
    node.accept(new TreeVisitor() {

        @Override
        public void endVisit(LabeledStatement labeledStatement) {
            final String name = labeledStatement.getLabel().getIdentifier();
            int value = labelCounts.containsKey(name) ? labelCounts.get(name) + 1 : 1;
            labelCounts.put(name, value);
            if (value > 1) {
                final String newName = name + '_' + value;
                labeledStatement.setLabel(new SimpleName(newName));
                // Update references to this label.
                labeledStatement.accept(new TreeVisitor() {

                    @Override
                    public void endVisit(ContinueStatement node) {
                        if (node.getLabel() != null && node.getLabel().getIdentifier().equals(name)) {
                            node.setLabel(new SimpleName(newName));
                        }
                    }

                    @Override
                    public void endVisit(BreakStatement node) {
                        if (node.getLabel() != null && node.getLabel().getIdentifier().equals(name)) {
                            node.setLabel(new SimpleName(newName));
                        }
                    }
                });
            }
        }
    });
    return true;
}
Also used : TreeVisitor(com.google.devtools.j2objc.ast.TreeVisitor) BreakStatement(com.google.devtools.j2objc.ast.BreakStatement) LabeledStatement(com.google.devtools.j2objc.ast.LabeledStatement) HashMap(java.util.HashMap) SimpleName(com.google.devtools.j2objc.ast.SimpleName) ContinueStatement(com.google.devtools.j2objc.ast.ContinueStatement)

Aggregations

LabeledStatement (com.google.devtools.j2objc.ast.LabeledStatement)7 ForStatement (com.google.devtools.j2objc.ast.ForStatement)5 Statement (com.google.devtools.j2objc.ast.Statement)5 Block (com.google.devtools.j2objc.ast.Block)4 EmptyStatement (com.google.devtools.j2objc.ast.EmptyStatement)4 IfStatement (com.google.devtools.j2objc.ast.IfStatement)4 BreakStatement (com.google.devtools.j2objc.ast.BreakStatement)3 ContinueStatement (com.google.devtools.j2objc.ast.ContinueStatement)3 DoStatement (com.google.devtools.j2objc.ast.DoStatement)2 EnhancedForStatement (com.google.devtools.j2objc.ast.EnhancedForStatement)2 SimpleName (com.google.devtools.j2objc.ast.SimpleName)2 TreeVisitor (com.google.devtools.j2objc.ast.TreeVisitor)2 WhileStatement (com.google.devtools.j2objc.ast.WhileStatement)2 ReturnStatement (com.google.devtools.j2objc.ast.ReturnStatement)1 SwitchStatement (com.google.devtools.j2objc.ast.SwitchStatement)1 ThrowStatement (com.google.devtools.j2objc.ast.ThrowStatement)1 TryStatement (com.google.devtools.j2objc.ast.TryStatement)1 HashMap (java.util.HashMap)1