use of com.google.devtools.j2objc.ast.ForStatement in project j2objc by google.
the class Rewriter method endVisit.
@Override
public void endVisit(ForStatement node) {
// nodes in the initializers.
if (node.getInitializers().size() == 1) {
Object initializer = node.getInitializer(0);
if (initializer instanceof VariableDeclarationExpression) {
List<VariableDeclarationFragment> fragments = ((VariableDeclarationExpression) initializer).getFragments();
for (VariableDeclarationFragment fragment : fragments) {
if (ElementUtil.hasAnnotation(fragment.getVariableElement(), AutoreleasePool.class)) {
Statement loopBody = node.getBody();
if (!(loopBody instanceof Block)) {
Block block = new Block();
node.setBody(block);
block.addStatement(loopBody);
}
((Block) node.getBody()).setHasAutoreleasePool(true);
}
}
}
}
}
use of com.google.devtools.j2objc.ast.ForStatement in project j2objc by google.
the class UnsequencedExpressionRewriter method visit.
@Override
public boolean visit(ForStatement node) {
List<Expression> initializers = node.getInitializers();
// expression or a list of initializer expressions.
if (initializers.size() == 1 && initializers.get(0) instanceof VariableDeclarationExpression) {
VariableDeclarationExpression decl = (VariableDeclarationExpression) initializers.get(0);
extractVariableDeclarationFragments(decl.getFragments(), TreeUtil.asStatementList(node).subList(0, 0));
} else {
extractExpressionList(initializers, TreeUtil.asStatementList(node).subList(0, 0), false);
}
Expression expr = node.getExpression();
if (expr != null) {
newExpression(expr);
expr.accept(this);
List<VariableAccess> toExtract = getUnsequencedAccesses();
if (!toExtract.isEmpty()) {
// Convert "if (;cond;)" into "if (;;) { if (!(cond)) break; ...}".
List<Statement> stmtList = TreeUtil.asStatementList(node.getBody()).subList(0, 0);
extractOrderedAccesses(stmtList, currentTopNode, toExtract);
stmtList.add(createLoopTermination(node.getExpression()));
node.setExpression(null);
}
}
extractExpressionList(node.getUpdaters(), TreeUtil.asStatementList(node.getBody()), true);
node.getBody().accept(this);
return false;
}
use of com.google.devtools.j2objc.ast.ForStatement 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);
}
use of com.google.devtools.j2objc.ast.ForStatement 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);
}
use of com.google.devtools.j2objc.ast.ForStatement in project j2objc by google.
the class TreeConverter method convertForLoop.
private TreeNode convertForLoop(JCTree.JCForLoop node) {
ForStatement newNode = new ForStatement().setExpression((Expression) convert(node.getCondition())).setBody((Statement) convert(node.getStatement()));
VariableDeclarationExpression lastVar = null;
for (JCTree.JCStatement initializer : node.getInitializer()) {
if (initializer.getKind() == Kind.VARIABLE) {
JCTree.JCVariableDecl var = (JCTree.JCVariableDecl) initializer;
VariableDeclarationExpression newVar = convertVariableExpression(var);
if (lastVar == null) {
newNode.addInitializer(newVar);
lastVar = newVar;
} else {
lastVar.addFragment(TreeUtil.remove(newVar.getFragment(0)));
}
} else {
assert initializer.getKind() == Kind.EXPRESSION_STATEMENT;
newNode.addInitializer((Expression) convert(((JCTree.JCExpressionStatement) initializer).getExpression()));
}
}
for (JCTree.JCExpressionStatement updater : node.getUpdate()) {
newNode.addUpdater((Expression) convert(updater.getExpression()));
}
return newNode;
}
Aggregations