private void checkForEach(Map<Symbol, Integer> forEachSymbols, @Nullable Tree previousIterable, ForEachStatement item) { ExpressionTree expressionTree = ExpressionUtils.skipParentheses(item.expression()); if (expressionTree.is(Tree.Kind.IDENTIFIER)) { checkForEachIdentifier(forEachSymbols, (IdentifierTree) expressionTree); } else if (previousIterable != null) { checkForEachExpression(previousIterable, expressionTree); } }
private void checkForEach(Map<Symbol, Integer> forEachSymbols, @Nullable Tree previousIterable, ForEachStatement item) { ExpressionTree expressionTree = ExpressionUtils.skipParentheses(item.expression()); if (expressionTree.is(Tree.Kind.IDENTIFIER)) { checkForEachIdentifier(forEachSymbols, (IdentifierTree) expressionTree); } else if (previousIterable != null) { checkForEachExpression(previousIterable, expressionTree); } }
@Override public void visitForEachStatement(ForEachStatement tree) { ExpressionTree expression = tree.expression(); if (expression instanceof IdentifierTree && isResourceIterator((IdentifierTree) expression)) { checkModelProviderCall(tree, tree.statement()); } super.visitForEachStatement(tree); }
@Override public void visitNode(Tree tree) { Map<Symbol, Integer> forEachSymbols = new HashMap<>(); Tree previousForeachIterable = null; for (Tree item : ((BlockTree) tree).body()) { if (item.is(Tree.Kind.FOR_EACH_STATEMENT)) { ForEachStatement forEachStatement = (ForEachStatement) item; checkForEach(forEachSymbols, previousForeachIterable, forEachStatement); previousForeachIterable = forEachStatement.expression(); } else { previousForeachIterable = null; item.accept(new InvalidatorVisitor(forEachSymbols)); } } }
@Override public void visitNode(Tree tree) { Map<Symbol, Integer> forEachSymbols = new HashMap<>(); Tree previousForeachIterable = null; for (Tree item : ((BlockTree) tree).body()) { if (item.is(Tree.Kind.FOR_EACH_STATEMENT)) { ForEachStatement forEachStatement = (ForEachStatement) item; checkForEach(forEachSymbols, previousForeachIterable, forEachStatement); previousForeachIterable = forEachStatement.expression(); } else { previousForeachIterable = null; item.accept(new InvalidatorVisitor(forEachSymbols)); } } }
@Override public void visitForEachStatement(ForEachStatement tree) { scan(tree.variable()); scan(tree.expression()); visitStatement(tree.statement()); }
private static boolean isForStatementInitializer(Tree lastElement, Tree loop) { if (loop.is(Tree.Kind.FOR_STATEMENT)) { return isDescendant(lastElement, ((ForStatementTree) loop).initializer()); } return loop.is(Tree.Kind.FOR_EACH_STATEMENT) && isDescendant(lastElement, ((ForEachStatement) loop).expression()); }
@Override public void visitForEachStatement(ForEachStatement tree) { scan(tree.variable()); scan(tree.expression()); scan(tree.statement()); }
@Override public void visitForEachStatement(ForEachStatement tree) { scan(tree.variable()); scan(tree.expression()); scan(tree.statement()); }
@Override public void visitForEachStatement(ForEachStatement tree) { scan(tree.variable()); scan(tree.expression()); scan(tree.statement()); }
@Override public void visitForEachStatement(ForEachStatement tree) { scan(tree.variable()); scan(tree.expression()); scan(tree.statement()); }
private static boolean isForStatementInitializer(Tree lastElement, Tree loop) { if (loop.is(Tree.Kind.FOR_STATEMENT)) { return isDescendant(lastElement, ((ForStatementTree) loop).initializer()); } return loop.is(Tree.Kind.FOR_EACH_STATEMENT) && isDescendant(lastElement, ((ForEachStatement) loop).expression()); }
@Override public void visitForEachStatement(ForEachStatement tree) { scan(tree.variable()); scan(tree.expression()); TypeTree typeTree = tree.variable().type(); if (typeTree.is(Tree.Kind.VAR_TYPE)) { JavaType iteratedObjectType = getIteratedObjectType((JavaType) tree.expression().symbolType()); setInferedType(upwardProjection(iteratedObjectType), (DeferredType) typeTree.symbolType()); } // scan the body only after handling type of variable scan(tree.statement()); }
private void buildForEachStatement(ForEachStatement tree) { // TODO(npe) One solution is to create a forstatement node depending on type of expression (iterable or array) and build CFG from it. Block afterLoop = currentBlock; Block statementBlock = createBlock(); Block loopback = createBranch(tree, statementBlock, afterLoop); currentBlock = createBlock(loopback); addContinueTarget(loopback); breakTargets.addLast(afterLoop); build(tree.statement()); breakTargets.removeLast(); continueTargets.removeLast(); statementBlock.addSuccessor(currentBlock); currentBlock = loopback; build(tree.variable()); currentBlock = createBlock(currentBlock); build(tree.expression()); currentBlock = createBlock(currentBlock); }
@Override public void visitForEachStatement(ForEachStatement tree) { scan(tree.variable()); scan(tree.expression()); TypeTree typeTree = tree.variable().type(); if (typeTree.is(Tree.Kind.VAR_TYPE)) { JavaType iteratedObjectType = getIteratedObjectType((JavaType) tree.expression().symbolType()); setInferedType(upwardProjection(iteratedObjectType), (DeferredType) typeTree.symbolType()); } // scan the body only after handling type of variable scan(tree.statement()); }
private void buildForEachStatement(ForEachStatement tree) { // TODO(npe) One solution is to create a forstatement node depending on type of expression (iterable or array) and build CFG from it. Block afterLoop = currentBlock; Block statementBlock = createBlock(); Block loopback = createBranch(tree, statementBlock, afterLoop); currentBlock = createBlock(loopback); addContinueTarget(loopback); breakTargets.addLast(afterLoop); build(tree.statement()); breakTargets.removeLast(); continueTargets.removeLast(); statementBlock.addSuccessor(currentBlock); currentBlock = loopback; build(tree.variable()); currentBlock = createBlock(currentBlock); build(tree.expression()); currentBlock = createBlock(currentBlock); }
@Override public void visitForEachStatement(ForEachStatement tree) { for (ExecutionState state : currentStates) { evaluateExpression(state, tree.expression()); } invalidateAssignedVariables(extractor.findAssignedVariables(tree)); currentStates = evaluateStatement(currentStates, tree.statement()); invalidateAssignedVariables(extractor.findAssignedVariables(tree)); }
@Override public void visitNode(Tree tree) { if (hasSemantic()) { ForEachStatement forEachTree = (ForEachStatement) tree; ExpressionTree expressionTree = forEachTree.expression(); if (expressionTree.is(Tree.Kind.METHOD_INVOCATION)) { MethodInvocationTree methodTree = (MethodInvocationTree) expressionTree; Symbol ownerSymbol = getOwnerSymbol(methodTree); if (ownerSymbol != null && MAP_KEYSET_METHOD.matches(methodTree)) { new GetUsageVisitor().isCallingGetWithSymbol(forEachTree, forEachTree.variable().symbol(), ownerSymbol); } } } }
@Override public void visitForEachStatement(ForEachStatement tree) { scan(tree.expression()); currentState.invalidateVariables(new AssignmentVisitor().findAssignedVariables(tree.statement())); currentState = new State(currentState); scan(tree.statement()); restorePreviousState(); }
@Override public void visitNode(Tree tree) { if (hasSemantic()) { ForEachStatement forEachTree = (ForEachStatement) tree; ExpressionTree expressionTree = forEachTree.expression(); if (expressionTree.is(Tree.Kind.METHOD_INVOCATION)) { MethodInvocationTree methodTree = (MethodInvocationTree) expressionTree; Symbol ownerSymbol = getOwnerSymbol(methodTree); if (ownerSymbol != null && MAP_KEYSET_METHOD.matches(methodTree)) { new GetUsageVisitor().isCallingGetWithSymbol(forEachTree, forEachTree.variable().symbol(), ownerSymbol); } } } }