@Override public void visitForEachStatement(ForEachStatementTree tree) { complexity.addComplexityWithNesting(tree.foreachToken()); visit(tree.expression()); visit(tree.key()); visit(tree.value()); visitWithNesting(tree.statements()); }
/** * Check there is exactly one space around "as" keyword and "=>" punctuator in foreach statement. */ private void checkForeachStatement(TokenVisitor tokenVisitor, ForEachStatementTree foreachLoop, SyntaxToken asKeyword, @Nullable SyntaxToken doubleArrow) { boolean isSpaceCorrectAs = isExactlyOneSpaceAroundOrLineSplit(tokenVisitor, asKeyword); boolean isSpaceCorrectDoubleArrow = doubleArrow == null || isExactlyOneSpaceAroundOrLineSplit(tokenVisitor, doubleArrow); String messageDetail = null; List<Tree> issueLocations = new ArrayList<>(); if (!isSpaceCorrectAs && !isSpaceCorrectDoubleArrow) { messageDetail = "\"as\" and \"=>\""; issueLocations.add(foreachLoop.asToken()); issueLocations.add(foreachLoop.doubleArrowToken()); } else if (!isSpaceCorrectAs) { messageDetail = "\"as\""; issueLocations.add(foreachLoop.asToken()); } else if (!isSpaceCorrectDoubleArrow) { messageDetail = "\"=>\""; issueLocations.add(foreachLoop.doubleArrowToken()); } if (messageDetail != null) { check.reportIssue(String.format(FOREACH_MESSAGE, messageDetail), issueLocations.toArray(new Tree[issueLocations.size()])); } }
@Override public void visitForEachStatement(ForEachStatementTree tree) { super.visitForEachStatement(tree); if (tree.is(Tree.Kind.FOREACH_STATEMENT)) { checkBlock(tree.statements().get(0), tree.closeParenthesisToken()); } }
@Override public void visitForEachStatement(ForEachStatementTree tree) { super.visitForEachStatement(tree); if (tree.is(Tree.Kind.FOREACH_STATEMENT)) { checkStatement(tree.statements().get(0), tree.foreachToken()); } }
@Test public void alternative_syntax() throws Exception { ForEachStatementTree tree = parse("foreach ($a as $b) : {} {} endforeach ;", PHPLexicalGrammar.FOREACH_STATEMENT); assertThat(tree.is(Kind.ALTERNATIVE_FOREACH_STATEMENT)).isTrue(); assertThat(tree.openParenthesisToken().text()).isEqualTo("("); assertThat(tree.expression().is(Kind.VARIABLE_IDENTIFIER)).isTrue(); assertThat(tree.asToken().text()).isEqualTo("as"); assertThat(tree.value().is(Kind.VARIABLE_IDENTIFIER)).isTrue(); assertThat(tree.key()).isNull(); assertThat(tree.doubleArrowToken()).isNull(); assertThat(tree.closeParenthesisToken().text()).isEqualTo(")"); assertThat(tree.colonToken().text()).isEqualTo(":"); assertThat(tree.endforeachToken().text()).isEqualTo("endforeach"); assertThat(tree.eosToken().text()).isEqualTo(";"); assertThat(tree.statements()).hasSize(2); assertThat(tree.eosToken().text()).isEqualTo(";"); }
@Override public void visitForEachStatement(ForEachStatementTree tree) { if (tree.key() != null) { if (tree.value().is(Tree.Kind.VARIABLE_IDENTIFIER)) { exclusions.add((IdentifierTree) tree.value()); } else if (tree.value().is(Tree.Kind.REFERENCE_VARIABLE) && ((ReferenceVariableTree) tree.value()).variableExpression().is(Tree.Kind.VARIABLE_IDENTIFIER)) { exclusions.add((IdentifierTree) ((ReferenceVariableTree) tree.value()).variableExpression()); } } super.visitForEachStatement(tree); }
@Override public void visitNode(Tree tree) { List<StatementTree> statements = getStatements(tree); for (int i = 0; i < statements.size() - 1; i++) { StatementTree currentStatement = statements.get(i); if (currentStatement.is(Kind.IF_STATEMENT)) { IfStatementTree ifStatement = (IfStatementTree) currentStatement; checkStatement(ifStatement.ifToken(), ifStatement.condition(), getLastStatementOfIf(ifStatement), i, statements); } else if (currentStatement.is(Kind.FOR_STATEMENT)) { ForStatementTree forStatement = (ForStatementTree) currentStatement; checkStatement(forStatement.forToken(), forStatement.closeParenthesisToken(), forStatement.statements().get(0), i, statements); } else if (currentStatement.is(Kind.FOREACH_STATEMENT)) { ForEachStatementTree forStatement = (ForEachStatementTree) currentStatement; checkStatement(forStatement.foreachToken(), forStatement.closeParenthesisToken(), forStatement.statements().get(0), i, statements); } else if (currentStatement.is(Kind.WHILE_STATEMENT)) { WhileStatementTree whileStatement = (WhileStatementTree) currentStatement; checkStatement(whileStatement.whileToken(), whileStatement.condition(), whileStatement.statements().get(0), i, statements); } } }
private PhpCfgBlock buildForEachStatement(ForEachStatementTree tree, PhpCfgBlock successor) { ForwardingBlock linkToCondition = createForwardingBlock(); addBreakable(successor, linkToCondition); PhpCfgBlock loopBodyBlock = buildSubFlow(tree.statements(), linkToCondition); removeBreakable(); PhpCfgBranchingBlock conditionBlock = createBranchingBlock(tree, loopBodyBlock, successor); conditionBlock.addElement(tree.expression()); linkToCondition.setSuccessor(conditionBlock); return createSimpleBlock(conditionBlock); }
protected boolean matches(TreeValues possibleValues, ExpressionTree value, ForEachStatementTree forEachStatementTree) { return forEachStatementTree.value() == value && nestedPredicates.test(possibleValues.lookupPossibleValues(forEachStatementTree.expression())); }
@Override public void visitForEachStatement(ForEachStatementTree tree) { checkIndentation(tree.foreachToken(), tree.statements()); super.visitForEachStatement(tree); }
@Override public void visitForEachStatement(ForEachStatementTree tree) { checkControlStructureOpenCurly(tree.closeParenthesisToken(), getOpenCurlyIfBlock(tree.statements())); super.visitForEachStatement(tree); }
@Test public void syntax_with_key() throws Exception { ForEachStatementTree tree = parse("foreach ($a as $key => $b) {}", PHPLexicalGrammar.FOREACH_STATEMENT); assertThat(tree.key()).isNotNull(); assertThat(tree.doubleArrowToken()).isNotNull(); }
private static boolean isInsideForEachExpression(Tree tree) { return tree == ((ForEachStatementTree) tree.getParent()).expression(); }
@Nullable private static ExpressionTree usageValue(Tree tree) { Tree parent = tree.getParent(); if (parent.is(Tree.Kind.ASSIGNMENT, Tree.Kind.ASSIGNMENT_BY_REFERENCE)) { AssignmentExpressionTree assignment = (AssignmentExpressionTree) parent; if (assignment.variable() == tree) { return CheckUtils.skipParenthesis(assignment.value()); } } else if (parent.is(Tree.Kind.FOREACH_STATEMENT)) { ForEachStatementTree forEachStatement = (ForEachStatementTree) parent; if (forEachStatement.value() == tree) { return forEachStatement.value(); } } return null; }
case FOREACH_STATEMENT: case ALTERNATIVE_FOREACH_STATEMENT: statements = ((ForEachStatementTree) tree).statements(); break; case FOR_STATEMENT:
@Override public void visitForEachStatement(ForEachStatementTree tree) { incrementComplexity(tree.foreachToken()); super.visitForEachStatement(tree); }
@Test public void standard_syntax() throws Exception { ForEachStatementTree tree = parse("foreach ($a as $b) {}", PHPLexicalGrammar.FOREACH_STATEMENT); assertThat(tree.is(Kind.FOREACH_STATEMENT)).isTrue(); assertThat(tree.openParenthesisToken().text()).isEqualTo("("); assertThat(tree.expression().is(Kind.VARIABLE_IDENTIFIER)).isTrue(); assertThat(tree.asToken().text()).isEqualTo("as"); assertThat(tree.value().is(Kind.VARIABLE_IDENTIFIER)).isTrue(); assertThat(tree.key()).isNull(); assertThat(tree.doubleArrowToken()).isNull(); assertThat(tree.colonToken()).isNull(); assertThat(tree.endforeachToken()).isNull(); assertThat(tree.eosToken()).isNull(); assertThat(tree.statements()).hasSize(1); assertThat(tree.statements().get(0).is(Kind.BLOCK)).isTrue(); assertThat(tree.eosToken()).isNull(); }
@Override public void visitForEachStatement(ForEachStatementTree tree) { if (tree.key() != null) { if (tree.value().is(Tree.Kind.VARIABLE_IDENTIFIER)) { exclusions.add((IdentifierTree) tree.value()); } else if (tree.value().is(Tree.Kind.REFERENCE_VARIABLE) && ((ReferenceVariableTree) tree.value()).variableExpression().is(Tree.Kind.VARIABLE_IDENTIFIER)) { exclusions.add((IdentifierTree) ((ReferenceVariableTree) tree.value()).variableExpression()); } } super.visitForEachStatement(tree); }
@Override public void visitForEachStatement(ForEachStatementTree tree) { super.visitForEachStatement(tree); if (tree.is(Tree.Kind.FOREACH_STATEMENT)) { checkStatement(tree.statements().get(0), tree.foreachToken()); } }
@Override public void visitNode(Tree tree) { List<StatementTree> statements = getStatements(tree); for (int i = 0; i < statements.size() - 1; i++) { StatementTree currentStatement = statements.get(i); if (currentStatement.is(Kind.IF_STATEMENT)) { IfStatementTree ifStatement = (IfStatementTree) currentStatement; checkStatement(ifStatement.ifToken(), ifStatement.condition(), getLastStatementOfIf(ifStatement), i, statements); } else if (currentStatement.is(Kind.FOR_STATEMENT)) { ForStatementTree forStatement = (ForStatementTree) currentStatement; checkStatement(forStatement.forToken(), forStatement.closeParenthesisToken(), forStatement.statements().get(0), i, statements); } else if (currentStatement.is(Kind.FOREACH_STATEMENT)) { ForEachStatementTree forStatement = (ForEachStatementTree) currentStatement; checkStatement(forStatement.foreachToken(), forStatement.closeParenthesisToken(), forStatement.statements().get(0), i, statements); } else if (currentStatement.is(Kind.WHILE_STATEMENT)) { WhileStatementTree whileStatement = (WhileStatementTree) currentStatement; checkStatement(whileStatement.whileToken(), whileStatement.condition(), whileStatement.statements().get(0), i, statements); } } }