@Override public void visitIfStatement(IfStatementTree tree) { scan(tree.condition()); scan(tree.thenStatement()); scan(tree.elseStatement()); }
private void checkIfStatement(IfStatementTree ifStmt) { checkStatement(ifStmt.ifKeyword(), ifStmt.thenStatement()); StatementTree elseStmt = ifStmt.elseStatement(); if (elseStmt != null && !elseStmt.is(Tree.Kind.IF_STATEMENT)) { checkStatement(ifStmt.elseKeyword(), elseStmt); } }
@Override public void visitIfStatement(IfStatementTree tree) { blame.add(tree.firstToken()); super.visitIfStatement(tree); }
@Override public void visitNode(Tree tree) { IfStatementTree treeIfStmt = (IfStatementTree) tree; StatementTree elseStmt = treeIfStmt.elseStatement(); if (elseStmt != null && elseStmt.is(Tree.Kind.IF_STATEMENT)) { IfStatementTree ifStmt = (IfStatementTree) elseStmt; if (ifStmt.elseStatement() == null) { reportIssue(treeIfStmt.elseKeyword(), ifStmt.ifKeyword(), "\"if ... else if\" constructs should end with \"else\" clauses."); } } } }
private static StatementTree getIfStatementLastBlock(StatementTree statementTree) { StatementTree block = statementTree; while (block.is(Tree.Kind.IF_STATEMENT)) { IfStatementTree ifStatementTree = (IfStatementTree) block; StatementTree elseStatement = ifStatementTree.elseStatement(); block = elseStatement == null ? ifStatementTree.thenStatement() : elseStatement; } return block; } }
@Override public void visitIfStatement(IfStatementTree tree) { checkBlock(tree.closeParenToken(), tree.thenStatement()); if (tree.elseKeyword() != null) { checkBlock(tree.elseKeyword(), tree.elseStatement()); } super.visitIfStatement(tree); }
@Override public void visitIfStatement(IfStatementTree tree) { Tree parentTree = tree.parent(); if (parentTree.is(Tree.Kind.IF_STATEMENT) && tree.equals(((IfStatementTree) parentTree).elseStatement())) { checkForReport(tree.thenStatement(), ((IfStatementTree) parentTree).elseKeyword(), tree.closeParenToken(), tree.ifKeyword().firstToken().text()); } else { checkForReport(tree.thenStatement(), tree.ifKeyword(), tree.closeParenToken(), tree.ifKeyword().text()); } SyntaxToken elseKeyword = tree.elseKeyword(); if (elseKeyword != null && !tree.elseStatement().is(Tree.Kind.IF_STATEMENT)) { checkForReport(tree.elseStatement(), elseKeyword, elseKeyword, elseKeyword.firstToken().text()); } super.visitIfStatement(tree); }
@Override public void visitIfStatement(IfStatementTree tree) { ExpressionTree condition = tree.condition(); StatementTree statement = tree.elseStatement(); while (statement != null && statement.is(Tree.Kind.IF_STATEMENT)) { IfStatementTree ifStatement = (IfStatementTree) statement; if (SyntacticEquivalence.areEquivalent(condition, ifStatement.condition())) { context.addIssue( ifStatement.condition(), this, "This branch can not be reached because the condition duplicates a previous condition in the same sequence of \"if/else if\" statements" ); } statement = ifStatement.elseStatement(); } super.visitIfStatement(tree); }
@Override public void visitNode(Tree tree) { if(tree.parent().is(Tree.Kind.IF_STATEMENT)) { IfStatementTree parentIf = (IfStatementTree) tree.parent(); if(tree.equals(parentIf.elseStatement())) { // don't double count nested ifs return; } } IfStatementTree ifStatementTree = (IfStatementTree) tree; int level = 1; while (ifStatementTree.elseKeyword() != null && ifStatementTree.elseStatement().is(Tree.Kind.IF_STATEMENT)) { level++; if(!sameEqualCondition(ifStatementTree.condition(), ((IfStatementTree) ifStatementTree.elseStatement()).condition())) { level = 0; break; } ifStatementTree = (IfStatementTree) ifStatementTree.elseStatement(); } if(level > 2) { reportIssue(((IfStatementTree) tree).condition(), "Convert this \"if/else if\" structure into a \"switch\"." + context.getJavaVersion().java7CompatibilityMessage()); } }
private void checkIfStatement(IfStatementTree ifStmt) { checkStatement(ifStmt.thenStatement(), ifStmt); StatementTree elseStmt = ifStmt.elseStatement(); if (elseStmt != null && !elseStmt.is(Tree.Kind.IF_STATEMENT)) { checkStatement(elseStmt, ifStmt.elseKeyword()); } }
@Override public void visitIfStatement(IfStatementTree tree) { addLine(tree.ifKeyword()); StatementTree thenStatement = tree.thenStatement(); StatementTree elseStatement = tree.elseStatement(); scan(thenStatement); scan(elseStatement); if (elseStatement == null) { addLineOfCloseBrace(tree.ifKeyword(), thenStatement); } else { addLineOfCloseBrace(tree.ifKeyword(), elseStatement); } }
@Override public void visitIfStatement(IfStatementTree tree) { if (!outerIf.isEmpty() && !hasElseClause(tree)) { context.reportIssue(this, tree.ifKeyword(), "Merge this if statement with the enclosing one.", Lists.newArrayList(new JavaFileScannerContext.Location("", outerIf.peek().ifKeyword())), null); } if (!hasElseClause(tree) && hasBodySingleIfStatement(tree.thenStatement())) { // children of this if statement are eligible for issues outerIf.push(tree); // recurse into sub-tree super.visitIfStatement(tree); if (!outerIf.isEmpty()) { outerIf.pop(); } } else { // direct children of this if statement not eligible for issues. Reset nesting count outerIf.clear(); super.visitIfStatement(tree); } }
@Override public void visitNode(Tree tree) { IfStatementTree ifStatementTree = (IfStatementTree) tree; SyntaxToken lastToken = ifStatementTree.thenStatement().lastToken(); if (ifStatementTree.elseKeyword() == null) { if(previousToken != null && isOnSameLineAsPreviousIf(ifStatementTree)) { reportIssue(ifStatementTree.ifKeyword(), "Move this \"if\" to a new line or add the missing \"else\".", Collections.singletonList(new JavaFileScannerContext.Location("", previousToken)), null); } previousToken = lastToken; } }
private static boolean hasElseClause(IfStatementTree tree) { return tree.elseStatement() != null; }
@Override public void visitNode(Tree tree) { if (tree.is(Tree.Kind.IF_STATEMENT)) { IfStatementTree ifStatementTree = (IfStatementTree) tree; StatementTree thenStatement = ifStatementTree.thenStatement(); if (ifStatementTree.elseKeyword() != null && thenStatement.is(Tree.Kind.BLOCK)) { checkTokenPosition(ifStatementTree.elseKeyword(), (BlockTree) thenStatement); } } else { TryStatementTree tryStatementTree = (TryStatementTree) tree; BlockTree block = tryStatementTree.block(); for (CatchTree catchTree : tryStatementTree.catches()) { checkTokenPosition(catchTree.catchKeyword(), block); block = catchTree.block(); } SyntaxToken finallyKeyword = tryStatementTree.finallyKeyword(); if (finallyKeyword != null) { checkTokenPosition(finallyKeyword, block); } } }
private static StatementTree getStatementTree(IfStatementTree ifStatementTree) { StatementTree elseStatementOrNextStatement = ifStatementTree.elseStatement(); if (elseStatementOrNextStatement == null) { JavaTree parent = (JavaTree) ifStatementTree.parent(); List<Tree> children = parent.getChildren(); int indexOfIf = children.indexOf(ifStatementTree); if (indexOfIf < children.size() - 1) { // Defensive, this condition should always be true as if necessarily followed by a statement or a token. Tree next = children.get(indexOfIf + 1); if(!next.is(Kind.TOKEN)) { elseStatementOrNextStatement = (StatementTree) next; } } } return elseStatementOrNextStatement; }
@Override public void visitIfStatement(IfStatementTree tree) { if (!outerIf.isEmpty() && !hasElseClause(tree)) { context.addIssue(tree, this, "Merge this if statement with the enclosing one."); } if (!hasElseClause(tree) && hasBodySingleIfStatement(tree.thenStatement())) { // children of this if statement are eligible for issues outerIf.push(Boolean.TRUE); // recurse into sub-tree super.visitIfStatement(tree); if (!outerIf.isEmpty()) { outerIf.pop(); } } else { // direct children of this if statement not eligible for issues. Reset nesting count outerIf.clear(); super.visitIfStatement(tree); } }
private boolean isSameLine(IfStatementTree ifStmt) { StatementTree thenStmt = ifStmt.thenStatement(); if (thenStmt.is(Tree.Kind.BLOCK)) { return false; } return ifStmt.firstToken().line() == thenStmt.firstToken().line(); }
@Override public void visitIfStatement(IfStatementTree tree) { SyntaxToken ifKeyword = tree.ifKeyword(); checkNesting(ifKeyword); nestingLevel.push(ifKeyword); visit(tree); nestingLevel.pop(); }