@Nullable @Override public CFG cfg() { if (block == null) { return null; } if (cfg == null) { cfg = CFG.build(this); } return cfg; }
private void buildConditionalOr(BinaryExpressionTree tree) { Block trueBlock = currentBlock; currentBlock = createBlock(trueBlock); // process RHS build(tree.rightOperand()); // process LHS buildConditionalBinaryLHS(tree, trueBlock, currentBlock); }
private void buildVariable(VariableTree tree) { currentBlock.elements.add(tree); ExpressionTree initializer = tree.initializer(); if (initializer != null) { build(initializer); } }
private void buildConditionalAnd(BinaryExpressionTree tree) { Block falseBlock = currentBlock; currentBlock = createBlock(falseBlock); // process RHS build(tree.rightOperand()); // process LHS buildConditionalBinaryLHS(tree, currentBlock, falseBlock); }
private void buildArrayDimension(ArrayDimensionTree tree) { ExpressionTree expression = tree.expression(); if (expression != null) { build(expression); } }
private void buildAssertStatement(AssertStatementTree assertStatementTree) { currentBlock.elements.add(assertStatementTree); // Ignore detail expression as it is only evaluated when assertion is false. build(assertStatementTree.condition()); }
private void buildTypeCast(Tree tree) { enclosingTry.peek().catches.entrySet().stream() .filter(e -> e.getKey().isSubtypeOf("java.lang.ClassCastException")) .findFirst() .ifPresent(e -> { currentBlock = createBlock(currentBlock); currentBlock.successors.add(e.getValue()); }); currentBlock.elements.add(tree); TypeCastTree typeCastTree = (TypeCastTree) tree; build(typeCastTree.expression()); }
private void buildAssignment(AssignmentExpressionTree tree) { currentBlock.elements.add(tree); build(tree.expression()); // The variable is not evaluated for simple assignment as it's only used to know where to store the value: JLS8-15.26 if (!ExpressionUtils.isSimpleAssignment(tree)) { build(tree.variable()); } }
@Override public void visitNode(Tree tree) { MethodTree methodTree = (MethodTree) tree; if (methodTree.block() != null) { CFG cfg = CFG.build(methodTree); cfg.blocks().forEach(this::checkBlock); } }
private void buildMemberSelect(MemberSelectExpressionTree mse) { currentBlock.elements.add(mse); // int.class or String[].class are memberSelectExpression which expression part is not an expression. if (!"class".equals(mse.identifier().name())) { build(mse.expression()); } }
private static boolean isLiveInMethodEntry(Symbol privateFieldSymbol, MethodTree methodTree) { CFG cfg = CFG.build(methodTree); LiveVariables liveVariables = LiveVariables.analyzeWithFields(cfg); return liveVariables.getIn(cfg.entryBlock()).contains(privateFieldSymbol); }
private void buildMethodInvocation(MethodInvocationTree mit) { handleExceptionalPaths(mit.symbol()); currentBlock.elements.add(mit); build(mit.arguments()); if (mit.methodSelect().is(Tree.Kind.MEMBER_SELECT)) { MemberSelectExpressionTree memberSelect = (MemberSelectExpressionTree) mit.methodSelect(); build(memberSelect.expression()); } else { build(mit.methodSelect()); } }
private void buildReturnStatement(ReturnStatementTree returnStatement) { currentBlock = createUnconditionalJump(returnStatement, exitBlock(), currentBlock); ExpressionTree expression = returnStatement.expression(); if (expression != null) { build(expression); } }
private void buildLabeledStatement(LabeledStatementTree labeledStatement) { String name = labeledStatement.label().name(); labelsBreakTarget.put(name, currentBlock); pendingLabel = name; currentBlock = createBlock(currentBlock); build(labeledStatement.statement()); currentBlock = createBlock(currentBlock); }
private void buildConditionalBinaryLHS(BinaryExpressionTree tree, Block trueBlock, Block falseBlock) { currentBlock = createBlock(); Block toComplete = currentBlock; build(tree.leftOperand()); toComplete.terminator = tree; toComplete.addFalseSuccessor(falseBlock); toComplete.addTrueSuccessor(trueBlock); }