@Override public void visitCatchBlock(CatchBlockTree tree) { super.visitCatchBlock(tree); checkBlock(tree.block(), tree.closeParenthesisToken()); }
@Override public void visitCatchBlock(CatchBlockTree tree) { exclusions.add(tree.variable()); super.visitCatchBlock(tree); }
@Test public void test() throws Exception { CatchBlockTree tree = parse("catch (ExceptionType $e) {}", PHPLexicalGrammar.CATCH_BLOCK); assertThat(tree.is(Kind.CATCH_BLOCK)).isTrue(); assertThat(tree.catchToken().text()).isEqualTo("catch"); assertThat(tree.openParenthesisToken().text()).isEqualTo("("); assertThat(tree.exceptionTypes()).hasSize(1); assertThat(tree.exceptionTypes().get(0).fullName()).isEqualTo("ExceptionType"); assertThat(tree.variable().variableExpression().text()).isEqualTo("$e"); assertThat(tree.closeParenthesisToken().text()).isEqualTo(")"); assertThat(expressionToString(tree.block())).isEqualTo("{}"); }
private static boolean hasSingleStatement(CatchBlockTree catchBlock) { return catchBlock.block().statements().size() == 1; }
private static boolean isRetrowingException(CatchBlockTree catchBlock) { StatementTree statement = catchBlock.block().statements().get(0); if (!statement.is(Tree.Kind.THROW_STATEMENT)) { return false; } ExpressionTree thrownExpression = CheckUtils.skipParenthesis(((ThrowStatementTree) statement).expression()); return SyntacticEquivalence.areSyntacticallyEquivalent(catchBlock.variable(), thrownExpression); } }
@Override public void visitCatchBlock(CatchBlockTree tree) { complexity.addComplexityWithNesting(tree.catchToken()); visitWithNesting(()-> super.visitCatchBlock(tree)); }
@Test public void multi_catch() throws Exception { CatchBlockTree tree = parse("catch (FirstException | SecondException | ThirdException $e) {}", PHPLexicalGrammar.CATCH_BLOCK); assertThat(tree.is(Kind.CATCH_BLOCK)).isTrue(); assertThat(tree.catchToken().text()).isEqualTo("catch"); assertThat(tree.openParenthesisToken().text()).isEqualTo("("); assertThat(tree.exceptionTypes()).hasSize(3); assertThat(tree.exceptionTypes().get(0).fullName()).isEqualTo("FirstException"); assertThat(tree.exceptionTypes().get(1).fullName()).isEqualTo("SecondException"); assertThat(tree.exceptionTypes().get(2).fullName()).isEqualTo("ThirdException"); assertThat(tree.variable().variableExpression().text()).isEqualTo("$e"); assertThat(tree.closeParenthesisToken().text()).isEqualTo(")"); assertThat(expressionToString(tree.block())).isEqualTo("{}"); }
private static boolean hasSingleStatement(CatchBlockTree catchBlock) { return catchBlock.block().statements().size() == 1; }
private static boolean isRetrowingException(CatchBlockTree catchBlock) { StatementTree statement = catchBlock.block().statements().get(0); if (!statement.is(Tree.Kind.THROW_STATEMENT)) { return false; } ExpressionTree thrownExpression = CheckUtils.skipParenthesis(((ThrowStatementTree) statement).expression()); return SyntacticEquivalence.areSyntacticallyEquivalent(catchBlock.variable(), thrownExpression); } }
@Override public void visitCatchBlock(CatchBlockTree tree) { complexity.addComplexityWithNesting(tree.catchToken()); visitWithNesting(()-> super.visitCatchBlock(tree)); }
@Override public void visitCatchBlock(CatchBlockTree tree) { super.visitCatchBlock(tree); checkBlock(tree.block(), tree.closeParenthesisToken()); }
@Override public void visitTryStatement(TryStatementTree tree) { List<CatchBlockTree> catchBlocks = tree.catchBlocks(); if (catchBlocks.stream().allMatch(catchBlock -> hasSingleStatement(catchBlock) && isRetrowingException(catchBlock))) { catchBlocks.stream() .flatMap(catchBlock -> catchBlock.block().statements().stream()) .forEach(statement -> context().newIssue(this, statement, "Add logic to this catch clause or eliminate it and rethrow the exception automatically.")); } super.visitTryStatement(tree); }
@Override public void visitTryStatement(TryStatementTree tree) { checkControlStructureOpenCurly(tree.tryToken(), tree.block().openCurlyBraceToken()); TokenVisitor tokenVisitor = new TokenVisitor(tree); // Check catch keyword for (CatchBlockTree catchBlock : tree.catchBlocks()) { checkCloseCurlyNextToKeyword(tokenVisitor.prevToken(catchBlock.catchToken()), catchBlock.catchToken()); } // Check finally keyword if (tree.finallyBlock() != null) { checkCloseCurlyNextToKeyword(tokenVisitor.prevToken(tree.finallyToken()), tree.finallyToken()); } super.visitTryStatement(tree); }
@Override public void visitCatchBlock(CatchBlockTree tree) { exclusions.add(tree.variable()); super.visitCatchBlock(tree); }
@Override public void visitCatchBlock(CatchBlockTree tree) { super.visitCatchBlock(tree); checkBlock(tree.block(), tree.closeParenthesisToken()); }
@Override public void visitTryStatement(TryStatementTree tree) { List<CatchBlockTree> catchBlocks = tree.catchBlocks(); if (catchBlocks.stream().allMatch(catchBlock -> hasSingleStatement(catchBlock) && isRetrowingException(catchBlock))) { catchBlocks.stream() .flatMap(catchBlock -> catchBlock.block().statements().stream()) .forEach(statement -> context().newIssue(this, statement, "Add logic to this catch clause or eliminate it and rethrow the exception automatically.")); } super.visitTryStatement(tree); }
@Override public void visitTryStatement(TryStatementTree tree) { checkControlStructureOpenCurly(tree.tryToken(), tree.block().openCurlyBraceToken()); TokenVisitor tokenVisitor = new TokenVisitor(tree); // Check catch keyword for (CatchBlockTree catchBlock : tree.catchBlocks()) { checkCloseCurlyNextToKeyword(tokenVisitor.prevToken(catchBlock.catchToken()), catchBlock.catchToken()); } // Check finally keyword if (tree.finallyBlock() != null) { checkCloseCurlyNextToKeyword(tokenVisitor.prevToken(tree.finallyToken()), tree.finallyToken()); } super.visitTryStatement(tree); }
@Override public void visitCatchBlock(CatchBlockTree tree) { super.visitCatchBlock(tree); checkBlock(tree.block(), tree.closeParenthesisToken()); }
private PhpCfgBlock buildTryStatement(TryStatementTree tree, PhpCfgBlock successor) { PhpCfgBlock exitBlock = exitTargets.peek().exitBlock; PhpCfgBlock finallyBlockEnd = createMultiSuccessorBlock(ImmutableSet.of(successor, exitBlock)); PhpCfgBlock finallyBlock; if (tree.finallyBlock() != null) { finallyBlock = build(tree.finallyBlock().statements(), finallyBlockEnd); } else { finallyBlock = finallyBlockEnd; } List<PhpCfgBlock> catchBlocks = tree.catchBlocks().stream() .map(catchBlockTree -> buildSubFlow(catchBlockTree.block().statements(), finallyBlock)) .collect(Collectors.toList()); if (catchBlocks.isEmpty()) { throwTargets.push(finallyBlock); } else { throwTargets.push(catchBlocks.get(0)); } Set<PhpCfgBlock> bodySuccessors = new HashSet<>(catchBlocks); bodySuccessors.add(finallyBlock); PhpCfgBlock tryBodySuccessors = createMultiSuccessorBlock(bodySuccessors); addBreakable(tryBodySuccessors, tryBodySuccessors); exitTargets.push(new TryBodyEnd(tryBodySuccessors, finallyBlock)); PhpCfgBlock tryBodyStartingBlock = build(tree.block().statements(), tryBodySuccessors); throwTargets.pop(); exitTargets.pop(); removeBreakable(); return tryBodyStartingBlock; }
@Override public void visitCatchBlock(CatchBlockTree tree) { checkControlStructureOpenCurly(tree.closeParenthesisToken(), tree.block().openCurlyBraceToken()); super.visitCatchBlock(tree); }