@Override public void visitForStatement(ForStatementTree tree) { scan(tree.initializer()); scan(tree.condition()); scan(tree.update()); scan(tree.statement()); }
@Override public void visitNode(Tree tree) { if (!hasSemantic()) { return; } ForStatementTree forStatementTree = (ForStatementTree) tree; if (forStatementTree.update().isEmpty() || forStatementTree.condition() == null) { return; } Collection<Symbol> symbolsFromConditionsNotUpdated = symbolsFromConditionsNotUpdated(forStatementTree); if (!symbolsFromConditionsNotUpdated.isEmpty()) { Map<Symbol, Tree> updatesInBody = singleUpdatesInBody(forStatementTree.statement(), symbolsFromConditionsNotUpdated); if (!updatesInBody.isEmpty()) { reportIssue(forStatementTree.forKeyword(), getMessage(updatesInBody.keySet()), getSecondaries(updatesInBody.values()), null); } } }
@Override public void visitForStatement(ForStatementTree tree) { // do not scan the initializer, updater and condition addLines(tree.forKeyword(), tree.closeParenToken()); addLineOfCloseBrace(tree.forKeyword(), tree.statement()); scan(tree.statement()); }
@Override public void visitNode(Tree tree) { ForStatementTree forStatementTree = (ForStatementTree) tree; if (forStatementTree.initializer().isEmpty() && forStatementTree.update().isEmpty() && forStatementTree.condition() != null) { context.reportIssue(this, forStatementTree.forKeyword(), "Replace this \"for\" loop with a \"while\" loop."); } } }
@Override public void visitNode(Tree tree) { if (tree.is(Tree.Kind.METHOD_INVOCATION)) { super.visitNode(tree); } else if(tree.is(Tree.Kind.FOR_STATEMENT)) { ForStatementTree fst = (ForStatementTree) tree; inWhileLoop.push(fst.initializer().isEmpty() && fst.condition()==null && fst.update().isEmpty()); } else { inWhileLoop.push(true); } }
@Override public void visitForStatement(ForStatementTree tree) { addKind(tree.forKeyword(), UastNode.Kind.FOR_KEYWORD); addKind(tree.initializer(), UastNode.Kind.FOR_INIT); addKind(tree.update(), UastNode.Kind.FOR_UPDATE); addKind(tree.statement(), UastNode.Kind.BODY); super.visitForStatement(tree); }
@Override public void visitForStatement(ForStatementTree tree) { scan(tree.statement()); }
@Override public void visitForStatement(ForStatementTree tree) { scan(tree.condition()); }
@Override public void visitForStatement(ForStatementTree tree) { statements++; super.visitForStatement(tree); removeVariable(tree.initializer()); removeVariable(tree.update()); }
@Override public void visitNode(Tree tree) { switch (tree.kind()) { case WHILE_STATEMENT: WhileStatementTree whileStatementTree = (WhileStatementTree) tree; checkStatement(whileStatementTree.whileKeyword(), whileStatementTree.statement()); break; case DO_STATEMENT: DoWhileStatementTree doWhileStatementTree = (DoWhileStatementTree) tree; checkStatement(doWhileStatementTree.doKeyword(), doWhileStatementTree.statement()); break; case FOR_STATEMENT: ForStatementTree forStatementTree = (ForStatementTree) tree; checkStatement(forStatementTree.forKeyword(), forStatementTree.statement()); break; case FOR_EACH_STATEMENT: ForEachStatement forEachStatement = (ForEachStatement) tree; checkStatement(forEachStatement.forKeyword(), forEachStatement.statement()); break; case IF_STATEMENT: checkIfStatement((IfStatementTree) tree); break; default: break; } }
@Override public void visitForStatement(ForStatementTree tree) { scan(tree.update()); }
private static boolean isForStatementInitializer(Tree lastElement, Tree loop) { if (loop.is(Tree.Kind.FOR_STATEMENT)) { return isDescendant(lastElement, ((ForStatementTree) loop).initializer()); } return loop.is(Tree.Kind.FOR_EACH_STATEMENT) && isDescendant(lastElement, ((ForEachStatement) loop).expression()); }
@Override public void visitForStatement(ForStatementTree tree) { checkBlock(tree.closeParenToken(), tree.statement()); super.visitForStatement(tree); }
@Override public void visitNode(Tree tree) { if (hasSemantic()) { ForStatementTree forStatementTree = (ForStatementTree) tree; if (!forStatementTree.update().isEmpty()) { Collection<Symbol> updateSymbols = getUpdatedSymbols(forStatementTree); ConditionVisitor conditionVisitor = new ConditionVisitor(updateSymbols); forStatementTree.accept(conditionVisitor); if (conditionVisitor.shouldRaiseIssue) { addIssue(tree, "This loop's stop condition tests \"" + Joiner.on(", ").join(conditionVisitor.conditionNames) + "\" but the incrementer updates \"" + getSymbols(updateSymbols) + "\"."); } } } }
@Override public void visitForStatement(ForStatementTree tree) { SyntaxToken forKeyword = tree.forKeyword(); checkNesting(forKeyword); nestingLevel.push(forKeyword); super.visitForStatement(tree); nestingLevel.pop(); }
private Collection<Symbol> getUpdatedSymbols(ForStatementTree forStatementTree) { UpdateVisitor updateVisitor = new UpdateVisitor(); forStatementTree.accept(updateVisitor); return updateVisitor.symbols; }