Search in sources :

Example 6 with TreeVisitor

use of com.google.devtools.j2objc.ast.TreeVisitor 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 7 with TreeVisitor

use of com.google.devtools.j2objc.ast.TreeVisitor 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)

Example 8 with TreeVisitor

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

the class Functionizer method hasSuperMethodInvocation.

private static boolean hasSuperMethodInvocation(MethodDeclaration node) {
    final boolean[] result = new boolean[1];
    result[0] = false;
    node.accept(new TreeVisitor() {

        @Override
        public void endVisit(SuperMethodInvocation node) {
            result[0] = true;
        }
    });
    return result[0];
}
Also used : TreeVisitor(com.google.devtools.j2objc.ast.TreeVisitor) UnitTreeVisitor(com.google.devtools.j2objc.ast.UnitTreeVisitor) SuperMethodInvocation(com.google.devtools.j2objc.ast.SuperMethodInvocation)

Aggregations

TreeVisitor (com.google.devtools.j2objc.ast.TreeVisitor)8 MethodDeclaration (com.google.devtools.j2objc.ast.MethodDeclaration)5 CompilationUnit (com.google.devtools.j2objc.ast.CompilationUnit)4 BreakStatement (com.google.devtools.j2objc.ast.BreakStatement)2 ContinueStatement (com.google.devtools.j2objc.ast.ContinueStatement)2 LabeledStatement (com.google.devtools.j2objc.ast.LabeledStatement)2 SimpleName (com.google.devtools.j2objc.ast.SimpleName)2 Statement (com.google.devtools.j2objc.ast.Statement)2 SuperMethodInvocation (com.google.devtools.j2objc.ast.SuperMethodInvocation)2 UnitTreeVisitor (com.google.devtools.j2objc.ast.UnitTreeVisitor)2 ExecutableElement (javax.lang.model.element.ExecutableElement)2 Block (com.google.devtools.j2objc.ast.Block)1 DoStatement (com.google.devtools.j2objc.ast.DoStatement)1 EmptyStatement (com.google.devtools.j2objc.ast.EmptyStatement)1 EnhancedForStatement (com.google.devtools.j2objc.ast.EnhancedForStatement)1 ForStatement (com.google.devtools.j2objc.ast.ForStatement)1 MethodInvocation (com.google.devtools.j2objc.ast.MethodInvocation)1 WhileStatement (com.google.devtools.j2objc.ast.WhileStatement)1 GeneratedExecutableElement (com.google.devtools.j2objc.types.GeneratedExecutableElement)1 ArrayList (java.util.ArrayList)1