private static Set<CfgBlock> findLoopBlocks(IterationStatementTree iterationStatement, Map<Tree, CfgBlock> treesOfFlowGraph) { Stream<JavaScriptTree> iterationTrees = iterationStatement.statement().descendants(); iterationTrees = addUpdateExpression(iterationStatement, iterationTrees); return iterationTrees.map(treesOfFlowGraph::get).filter(Objects::nonNull).collect(Collectors.toSet()); }
private static Tree nestedStatement(Tree nestingStatement) { if (nestingStatement.is(Kind.IF_STATEMENT)) { return ((IfStatementTree) nestingStatement).statement(); } return ((IterationStatementTree) nestingStatement).statement(); }
private void visitObjectIterationStatement(IterationStatementTree tree, Tree counterBlock) { currentLoopCounters = new HashSet<>(); scanCounterBlock(counterBlock); enterLoopBody(); scan(tree.statement()); leaveLoopBody(); }
private static boolean hasPredecessorInsideLoopBody(CfgBranchingBlock conditionBlock, IterationStatementTree loopTree) { for (CfgBlock loopPredecessor : conditionBlock.predecessors()) { List<Tree> predecessorElements = loopPredecessor.elements(); Tree predecessorLastElement = predecessorElements.get(predecessorElements.size() - 1); if (loopTree.is(Kind.FOR_STATEMENT)) { ForStatementTree forTree = (ForStatementTree) loopTree; if (forTree.update() != null && forTree.update().equals(predecessorLastElement)) { return !loopPredecessor.predecessors().isEmpty(); } } StatementTree loopBody = loopTree.statement(); if (isDescendant(predecessorLastElement, loopBody)) { return true; } } return false; }
private static Set<Tree> getNeverExecutedCode(Tree condition, boolean isTruthy) { Set<Tree> neverExecutedCode = new HashSet<>(); Tree biggestTreeWithSameTruthiness = biggestTreeWithSameTruthiness(condition, isTruthy, neverExecutedCode); Tree parent = CheckUtils.parentIgnoreParentheses(biggestTreeWithSameTruthiness); if (parent.is(Kind.IF_STATEMENT)) { IfStatementTree ifStatementTree = (IfStatementTree) parent; if (isTruthy) { if (ifStatementTree.elseClause() != null) { neverExecutedCode.add(ifStatementTree.elseClause()); } } else { neverExecutedCode.add(ifStatementTree.statement()); } } else if (parent.is(KindSet.LOOP_KINDS) && !isTruthy) { neverExecutedCode.add(((IterationStatementTree) parent).statement()); } else if (parent.is(Kind.CONDITIONAL_EXPRESSION)) { ConditionalExpressionTree conditionalExpressionTree = (ConditionalExpressionTree) parent; neverExecutedCode.add(isTruthy ? conditionalExpressionTree.falseExpression() : conditionalExpressionTree.trueExpression()); } return neverExecutedCode; }
@Override public void visitNode(Tree tree) { if (tree.is(Kind.ELSE_CLAUSE)) { visitElseClause(tree); } else if (tree.is(Kind.IF_STATEMENT)) { checkAreCurlyBracesUsed(((IfStatementTree) tree).statement(), tree); } else { checkAreCurlyBracesUsed(((IterationStatementTree) tree).statement(), tree); } }
@Override public void visitNode(Tree tree) { if (tree.is(Kind.ELSE_CLAUSE)) { visitElseClause(tree); } else if (tree.is(Kind.IF_STATEMENT)) { checkAreCurlyBracesUsed(((IfStatementTree) tree).statement(), tree); } else { checkAreCurlyBracesUsed(((IterationStatementTree) tree).statement(), tree); } }
@Override public void visitNode(Tree tree) { if (tree.is(Kind.IF_STATEMENT)) { checkForExcludedStatement(((IfStatementTree) tree).statement(), tree); } if (tree.is(KindSet.LOOP_KINDS)) { checkForExcludedStatement(((IterationStatementTree) tree).statement(), tree); } if (tree.is(Kind.FUNCTION_EXPRESSION, Kind.GENERATOR_FUNCTION_EXPRESSION, Kind.ARROW_FUNCTION)){ checkFunctionException((FunctionTree)tree); } if (!tree.is(Kind.SCRIPT, Kind.FUNCTION_EXPRESSION, Kind.GENERATOR_FUNCTION_EXPRESSION, Kind.ARROW_FUNCTION) && !excludedStatements.contains(tree)){ statementsPerLine.put(tree.firstToken().line(), (StatementTree) tree); } }