/** * Removes DOs that have empty bodies into FORs, which are * much easier for the CFA to analyze. */ Node tryFoldEmptyDo(Node n) { checkArgument(n.isDo()); Node body = NodeUtil.getLoopCodeBlock(n); if (body.isBlock() && !body.hasChildren()) { Node cond = NodeUtil.getConditionExpression(n); Node forNode = IR.forNode(IR.empty().srcref(n), cond.detach(), IR.empty().srcref(n), body.detach()); n.replaceWith(forNode); reportChangeToEnclosingScope(forNode); return forNode; } return n; }
/** * Removes DOs that have empty bodies into FORs, which are * much easier for the CFA to analyze. */ Node tryFoldEmptyDo(Node n) { Preconditions.checkArgument(n.isDo()); Node body = NodeUtil.getLoopCodeBlock(n); if (body.isBlock() && !body.hasChildren()) { Node cond = NodeUtil.getConditionExpression(n); Node whileNode = IR.forNode(IR.empty().srcref(n), cond.detachFromParent(), IR.empty().srcref(n), body.detachFromParent()) .srcref(n); n.getParent().replaceChild(n, whileNode); reportCodeChange(); return whileNode; } return n; }
IR.forNode(init, forCond, IR.empty().useSourceInfoFrom(n), body.detach()) .useSourceInfoFrom(n);
IR.forNode( initializer, IR.empty(),
Node newFor = IR.forNode(init, cond, incr, body); newFor.useSourceInfoIfMissingFromForTree(node); parent.replaceChild(node, newFor);
IR.call(IR.getprop(arrayName.cloneTree(), IR.string("push")), variable)))); Node newFor = IR.forNode( IR.assign(varName.cloneTree(), IR.number(0)), IR.lt(varName.cloneTree(), IR.getprop(arrayName, IR.string("length"))),
IR.forNode( IR.var(cursorName.cloneTree(), IR.number(restIndex).setJSType(numberType)), IR.lt(
IR.getelem(IR.name(REST_PARAMS), IR.sub(IR.name(REST_INDEX), IR.number(restIndex))), IR.getelem(IR.name("arguments"), IR.name(REST_INDEX))))); functionBody.addChildAfter(IR.forNode(init, cond, incr, body) .useSourceInfoIfMissingFromForTree(restParam), newArr); functionBody.addChildToBack(newBlock);
Node newFor = IR.forNode(init, cond, incr, newBody); newFor.useSourceInfoIfMissingFromForTree(node); parent.replaceChild(node, newFor);