@Override public void visitSwitchStatement(SwitchStatementTree tree) { List<SwitchCaseClauseTree> clauses = tree.cases(); if (clauses.size() > 2) { clauses.subList(1, clauses.size() - 1) .stream() .filter(clause -> clause.is(Kind.DEFAULT_CLAUSE)) .forEach(defaultTree -> context().newIssue(this, defaultTree.caseToken(), MESSAGE)); } super.visitSwitchStatement(tree); }
private static boolean isEmpty(SwitchCaseClauseTree caseClause) { return caseClause.statements().isEmpty(); }
@Override public void visitSwitchStatement(SwitchStatementTree tree) { List<List<StatementTree>> normalizedBranches = new ArrayList<>(); boolean hasDefault = false; boolean hasFallthrough = false; int lastIndex = tree.cases().size() - 1; for (int i = 0; i < tree.cases().size(); i++) { SwitchCaseClauseTree switchCaseClause = tree.cases().get(i); List<StatementTree> statements = switchCaseClause.statements(); if (switchCaseClause.is(Kind.DEFAULT_CLAUSE)) { hasDefault = true; } if (!statements.isEmpty()) { normalizedBranches.add(normalize(statements)); if (i != lastIndex && !endsWithBreak(statements)) { hasFallthrough = true; } } } if (!normalizedBranches.isEmpty()) { // we don't want to report all duplicate branches for "switch" without "default" // this means that in some case (no 'case' was matched) nothing will be done // same for "switch" with fallthrough, some branches will be fallen through, thus not identical boolean reportAllDuplicate = hasDefault && !hasFallthrough; checkBranches("case", normalizedBranches, reportAllDuplicate, tree.switchToken()); } super.visitSwitchStatement(tree); }
@Override public void visitSwitchStatement(SwitchStatementTree tree) { super.visitSwitchStatement(tree); List<ExpressionTree> expressions = new ArrayList<>(); for (SwitchCaseClauseTree switchCaseClauseTree : tree.cases()) { if (switchCaseClauseTree.is(Kind.CASE_CLAUSE)) { expressions.add(((CaseClauseTree) switchCaseClauseTree).expression()); } } checkForEquality(expressions, "case"); }
@Override public void visitSwitchStatement(SwitchStatementTree switchTree) { SwitchCaseClauseTree currentClause = null; for (SwitchCaseClauseTree nextClause : switchTree.cases()) { if (currentClause != null && !isEmpty(currentClause) && !hasJumpStatement(currentClause) && !hasNoBreakComment(nextClause)) { context().newIssue(this, currentClause.caseToken(), currentClause.caseSeparatorToken(), MESSAGE); } currentClause = nextClause; } super.visitSwitchStatement(switchTree); }
private static boolean hasNoBreakComment(SwitchCaseClauseTree caseClause) { return !caseClause.caseToken().trivias().isEmpty(); }
@Override public void visitSwitchStatement(SwitchStatementTree tree) { List<List<StatementTree>> normalizedBranches = new ArrayList<>(); boolean hasDefault = false; boolean hasFallthrough = false; int lastIndex = tree.cases().size() - 1; for (int i = 0; i < tree.cases().size(); i++) { SwitchCaseClauseTree switchCaseClause = tree.cases().get(i); List<StatementTree> statements = switchCaseClause.statements(); if (switchCaseClause.is(Kind.DEFAULT_CLAUSE)) { hasDefault = true; } if (!statements.isEmpty()) { normalizedBranches.add(normalize(statements)); if (i != lastIndex && !endsWithBreak(statements)) { hasFallthrough = true; } } } if (!normalizedBranches.isEmpty()) { // we don't want to report all duplicate branches for "switch" without "default" // this means that in some case (no 'case' was matched) nothing will be done // same for "switch" with fallthrough, some branches will be fallen through, thus not identical boolean reportAllDuplicate = hasDefault && !hasFallthrough; checkBranches("case", normalizedBranches, reportAllDuplicate, tree.switchToken()); } super.visitSwitchStatement(tree); }
@Override public void visitSwitchStatement(SwitchStatementTree tree) { super.visitSwitchStatement(tree); List<ExpressionTree> expressions = new ArrayList<>(); for (SwitchCaseClauseTree switchCaseClauseTree : tree.cases()) { if (switchCaseClauseTree.is(Kind.CASE_CLAUSE)) { expressions.add(((CaseClauseTree) switchCaseClauseTree).expression()); } } checkForEquality(expressions, "case"); }
@Override public void visitSwitchStatement(SwitchStatementTree switchTree) { SwitchCaseClauseTree currentClause = null; for (SwitchCaseClauseTree nextClause : switchTree.cases()) { if (currentClause != null && !isEmpty(currentClause) && !hasJumpStatement(currentClause) && !hasNoBreakComment(nextClause)) { context().newIssue(this, currentClause.caseToken(), currentClause.caseSeparatorToken(), MESSAGE); } currentClause = nextClause; } super.visitSwitchStatement(switchTree); }
private static boolean hasNoBreakComment(SwitchCaseClauseTree caseClause) { return !caseClause.caseToken().trivias().isEmpty(); }
private PhpCfgBlock buildSwitchStatement(SwitchStatementTree tree, PhpCfgBlock successor) { ForwardingBlock defaultBlock = createForwardingBlock(); defaultBlock.setSuccessor(successor); PhpCfgBlock nextCase = defaultBlock; PhpCfgBlock caseBody = successor; addBreakable(successor, successor); for (SwitchCaseClauseTree caseTree : Lists.reverse(tree.cases())) { caseBody = buildSubFlow(caseTree.statements(), caseBody); if (caseTree.is(Tree.Kind.CASE_CLAUSE)) { PhpCfgBranchingBlock caseBranch = createBranchingBlock(caseTree, caseBody, nextCase); caseBranch.addElement(((CaseClauseTree) caseTree).expression()); nextCase = caseBranch; } else { // default case defaultBlock.setSuccessor(caseBody); } } removeBreakable(); PhpCfgBlock block = createSimpleBlock(nextCase); block.addElement(tree.expression()); return block; }
private static boolean isEmpty(SwitchCaseClauseTree caseClause) { return caseClause.statements().isEmpty(); }
@Override public void visitSwitchStatement(SwitchStatementTree tree) { List<SwitchCaseClauseTree> clauses = tree.cases(); if (clauses.size() > 2) { clauses.subList(1, clauses.size() - 1) .stream() .filter(clause -> clause.is(Kind.DEFAULT_CLAUSE)) .forEach(defaultTree -> context().newIssue(this, defaultTree.caseToken(), MESSAGE)); } super.visitSwitchStatement(tree); }
@Override public void visitSwitchStatement(SwitchStatementTree switchTree) { if (switchTree.cases().stream().noneMatch(clause -> clause.is(Kind.DEFAULT_CLAUSE))) { context().newIssue(this, switchTree.switchToken(), "Add a \"case default\" clause to this \"switch\" statement."); } super.visitSwitchStatement(switchTree); } }
private void checkCaseClause(SwitchCaseClauseTree clause) { int lines = LineVisitor.linesOfCode(clause); if (lines > max) { context().newIssue(this, clause.caseToken(), String.format(MESSAGE, lines, max)); } } }
private PhpCfgBlock buildSwitchStatement(SwitchStatementTree tree, PhpCfgBlock successor) { ForwardingBlock defaultBlock = createForwardingBlock(); defaultBlock.setSuccessor(successor); PhpCfgBlock nextCase = defaultBlock; PhpCfgBlock caseBody = successor; addBreakable(successor, successor); for (SwitchCaseClauseTree caseTree : Lists.reverse(tree.cases())) { caseBody = buildSubFlow(caseTree.statements(), caseBody); if (caseTree.is(Tree.Kind.CASE_CLAUSE)) { PhpCfgBranchingBlock caseBranch = createBranchingBlock(caseTree, caseBody, nextCase); caseBranch.addElement(((CaseClauseTree) caseTree).expression()); nextCase = caseBranch; } else { // default case defaultBlock.setSuccessor(caseBody); } } removeBreakable(); PhpCfgBlock block = createSimpleBlock(nextCase); block.addElement(tree.expression()); return block; }
private static boolean hasJumpStatement(SwitchCaseClauseTree caseClause) { List<StatementTree> statements = caseClause.statements(); if (statements.get(statements.size() - 1).is(Kind.BREAK_STATEMENT)) { return true; } return JumpStatementFinder.hasJumpStatement(caseClause); }
@Override public void visitSwitchStatement(SwitchStatementTree switchTree) { if (switchTree.cases().stream().noneMatch(clause -> clause.is(Kind.DEFAULT_CLAUSE))) { context().newIssue(this, switchTree.switchToken(), "Add a \"case default\" clause to this \"switch\" statement."); } super.visitSwitchStatement(switchTree); } }
private void checkCaseClause(SwitchCaseClauseTree clause) { int lines = LineVisitor.linesOfCode(clause); if (lines > max) { context().newIssue(this, clause.caseToken(), String.format(MESSAGE, lines, max)); } } }
private static boolean hasJumpStatement(SwitchCaseClauseTree caseClause) { List<StatementTree> statements = caseClause.statements(); if (statements.get(statements.size() - 1).is(Kind.BREAK_STATEMENT)) { return true; } return JumpStatementFinder.hasJumpStatement(caseClause); }