private static CFG.Block getLoopBlock(CFG cfg, Tree loopTree) { return cfg.blocks().stream() .filter(block -> loopTree.equals(block.terminator())) .findFirst() .orElseThrow(() -> new IllegalStateException("CFG necessarily contains the loop block.")); }
private static CFG.Block getLoopBlock(CFG cfg, Tree loopTree) { return cfg.blocks().stream() .filter(block -> loopTree.equals(block.terminator())) .findFirst() .orElseThrow(() -> new IllegalStateException("CFG necessarily contains the loop block.")); }
private void collectWaysOut(Map<Tree, CFGLoop> container) { for (CFG.Block block : blocks) { if (isStarting(block)) { CFGLoop innerLoop = container.get(block.terminator()); successors.addAll(innerLoop.successors()); } else { successors.addAll(block.successors()); } } successors.removeAll(blocks); successors.remove(startingBlock); }
@CheckForNull private static Set<Block> localSuccessors(CFG.Block block, Map<Tree, CFGLoop> container) { if (isStarting(block)) { CFGLoop loop = container.get(block.terminator()); if (loop == null) { loop = create(block, container); } Set<Block> loopSuccessors = new HashSet<>(loop.successors); if (block.trueBlock() == null) { // Special case where no condition is given in FOR loop: only one successor specified return null; } else { loopSuccessors.add(block.falseBlock()); } return loopSuccessors; } return block.successors(); }
@CheckForNull private static Set<Block> localSuccessors(CFG.Block block, Map<Tree, CFGLoop> container) { if (isStarting(block)) { CFGLoop loop = container.get(block.terminator()); if (loop == null) { loop = create(block, container); } Set<Block> loopSuccessors = new HashSet<>(loop.successors); if (block.trueBlock() == null) { // Special case where no condition is given in FOR loop: only one successor specified return null; } else { loopSuccessors.add(block.falseBlock()); } return loopSuccessors; } return block.successors(); }
private void checkBlock(Block block) { Block successorWithoutJump = block.successorWithoutJump(); Tree terminator = block.terminator(); if (terminator != null && successorWithoutJump != null && terminator.is(Tree.Kind.CONTINUE_STATEMENT, Tree.Kind.RETURN_STATEMENT) && !isReturnWithExpression(terminator) && !isSwitchCaseChild(terminator)) { successorWithoutJump = nonEmptySuccessor(successorWithoutJump); Block successor = nonEmptySuccessor(block.successors().iterator().next()); if (successorWithoutJump.equals(successor)) { reportIssue(terminator, "Remove this redundant jump."); } } }
private void checkBlock(Block block) { Block successorWithoutJump = block.successorWithoutJump(); Tree terminator = block.terminator(); if (terminator != null && successorWithoutJump != null && terminator.is(Tree.Kind.CONTINUE_STATEMENT, Tree.Kind.RETURN_STATEMENT) && !isReturnWithExpression(terminator) && !isSwitchCaseChild(terminator)) { successorWithoutJump = nonEmptySuccessor(successorWithoutJump); Block successor = nonEmptySuccessor(block.successors().iterator().next()); if (successorWithoutJump.equals(successor)) { reportIssue(terminator, "Remove this redundant jump."); } } }
private static boolean isRestartingForEachLoop(ProgramPoint programPoint) { Tree terminator = ((CFG.Block) programPoint.block).terminator(); return terminator != null && terminator.is(Tree.Kind.FOR_EACH_STATEMENT); }
private static boolean isBreak(CFG.Block block) { Tree terminator = block.terminator(); return terminator != null && terminator.is(Tree.Kind.BREAK_STATEMENT); }
private static boolean isStarting(CFG.Block block) { Tree terminator = block.terminator(); return terminator != null && terminator.is(Tree.Kind.FOR_STATEMENT, Tree.Kind.WHILE_STATEMENT, Tree.Kind.DO_STATEMENT); }
public static Map<Tree, CFGLoop> getCFGLoops(CFG cfg) { Map<Tree, CFGLoop> cfgLoops = new HashMap<>(); for (CFG.Block block : cfg.blocks()) { if (CFGLoop.isStarting(block)) { Tree terminator = block.terminator(); if (!cfgLoops.containsKey(terminator)) { create(block, cfgLoops); } } } return cfgLoops; }
private void collectWaysOut(Map<Tree, CFGLoop> container) { for (CFG.Block block : blocks) { if (isStarting(block)) { CFGLoop innerLoop = container.get(block.terminator()); successors.addAll(innerLoop.successors()); } else { successors.addAll(block.successors()); } } successors.removeAll(blocks); successors.remove(startingBlock); }
private static boolean isStarting(CFG.Block block) { Tree terminator = block.terminator(); return terminator != null && terminator.is(Tree.Kind.FOR_STATEMENT, Tree.Kind.WHILE_STATEMENT, Tree.Kind.DO_STATEMENT); }
private static boolean isRestartingForEachLoop(ProgramPoint programPoint) { Tree terminator = ((CFG.Block) programPoint.block).terminator(); return terminator != null && terminator.is(Tree.Kind.FOR_EACH_STATEMENT); }
public Tree syntaxTree() { if (block instanceof CFG.Block) { CFG.Block syntaxCFGblock = (CFG.Block) this.block; if (block.elements().isEmpty()) { return syntaxCFGblock.terminator(); } return syntaxCFGblock.elements().get(Math.min(i, syntaxCFGblock.elements().size() - 1)); } return null; } }
private static CFGLoop create(CFG.Block block, Map<Tree, CFGLoop> container) { CFGLoop loop = new CFGLoop(block); container.put(block.terminator(), loop); loop.initialize(block, container); return loop; } }
private static boolean isBreak(CFG.Block block) { Tree terminator = block.terminator(); return terminator != null && terminator.is(Tree.Kind.BREAK_STATEMENT); }
private static CFGLoop create(CFG.Block block, Map<Tree, CFGLoop> container) { CFGLoop loop = new CFGLoop(block); container.put(block.terminator(), loop); loop.initialize(block, container); return loop; } }
public static Map<Tree, CFGLoop> getCFGLoops(CFG cfg) { Map<Tree, CFGLoop> cfgLoops = new HashMap<>(); for (CFG.Block block : cfg.blocks()) { if (CFGLoop.isStarting(block)) { Tree terminator = block.terminator(); if (!cfgLoops.containsKey(terminator)) { create(block, cfgLoops); } } } return cfgLoops; }
public Tree syntaxTree() { if (block instanceof CFG.Block) { CFG.Block syntaxCFGblock = (CFG.Block) this.block; if (block.elements().isEmpty()) { return syntaxCFGblock.terminator(); } return syntaxCFGblock.elements().get(Math.min(i, syntaxCFGblock.elements().size() - 1)); } return null; } }