use of com.google.devtools.j2objc.ast.BreakStatement in project j2objc by google.
the class UnsequencedExpressionRewriter method createLoopTermination.
private IfStatement createLoopTermination(Expression loopCondition) {
IfStatement newIf = new IfStatement();
newIf.setExpression(new PrefixExpression(typeUtil.getBoolean(), PrefixExpression.Operator.NOT, ParenthesizedExpression.parenthesize(loopCondition.copy())));
newIf.setThenStatement(new BreakStatement());
return newIf;
}
use of com.google.devtools.j2objc.ast.BreakStatement in project j2objc by google.
the class TreeConverter method convertBreakStatement.
private TreeNode convertBreakStatement(JCTree.JCBreak node) {
BreakStatement newNode = new BreakStatement();
Object label = node.getLabel();
if (label != null) {
newNode.setLabel((SimpleName) new SimpleName(label.toString()).setPosition(getPosition(node)));
}
return newNode;
}
use of com.google.devtools.j2objc.ast.BreakStatement 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()));
}
}
use of com.google.devtools.j2objc.ast.BreakStatement 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;
}
Aggregations