private static boolean isNontrivial(List<StatementTree> statements) { return statements.stream() .flatMap(statement -> statement.is(Kind.BLOCK) ? ((BlockTree) statement).statements().stream() : Stream.of(statement)) .mapToInt(LineVisitor::linesOfCode) .sum() > 1; }
private static boolean isNontrivial(List<StatementTree> statements) { return statements.stream() .flatMap(statement -> statement.is(Kind.BLOCK) ? ((BlockTree) statement).statements().stream() : Stream.of(statement)) .mapToInt(LineVisitor::linesOfCode) .sum() > 1; }
@Override public void visitFunctionDeclaration(FunctionDeclarationTree tree) { // Ignore empty functions if (!tree.body().statements().isEmpty()) { functions.add(tree); } super.visitFunctionDeclaration(tree); }
@Override public void visitFunctionDeclaration(FunctionDeclarationTree tree) { // Ignore empty functions if (!tree.body().statements().isEmpty()) { functions.add(tree); } super.visitFunctionDeclaration(tree); }
private static boolean isAccessor(MethodDeclarationTree tree) { String methodName = tree.name().text(); return ((BlockTree) tree.body()).statements().size() == 1 && (methodName.startsWith("set") || methodName.startsWith("get") || methodName.startsWith("is")); }
private static boolean isAccessor(MethodDeclarationTree tree) { String methodName = tree.name().text(); return ((BlockTree) tree.body()).statements().size() == 1 && (methodName.startsWith("set") || methodName.startsWith("get") || methodName.startsWith("is")); }
/** * <b>WARNING:</b> This is an experimental API, it may change without notice. */ public static ControlFlowGraph build(BlockTree body) { return new ControlFlowGraphBuilder(body.statements()).getGraph(); }
/** * <b>WARNING:</b> This is an experimental API, it may change without notice. */ public static ControlFlowGraph build(BlockTree body) { return new ControlFlowGraphBuilder(body.statements()).getGraph(); }
@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 visitBlock(BlockTree tree) { super.visitBlock(tree); SyntaxToken prevToken = tree.openCurlyBraceToken(); List<StatementTree> statements = tree.statements(); if (!statements.isEmpty()) { prevToken = ((PHPTree) statements.get(statements.size() - 1)).getLastToken(); } checkCloseCurlyBrace(tree.closeCurlyBraceToken(), tree.openCurlyBraceToken(), prevToken); }
@Override public void visitBlock(BlockTree tree) { super.visitBlock(tree); SyntaxToken prevToken = tree.openCurlyBraceToken(); List<StatementTree> statements = tree.statements(); if (!statements.isEmpty()) { prevToken = ((PHPTree) statements.get(statements.size() - 1)).getLastToken(); } checkCloseCurlyBrace(tree.closeCurlyBraceToken(), tree.openCurlyBraceToken(), prevToken); }
private static boolean isDuplicateCandidate(MethodDeclarationTree tree) { return tree.body().is(Tree.Kind.BLOCK) && (((BlockTree) tree.body()).statements().size() >=2 || isAccessor(tree)); }
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 visitBlock(BlockTree tree) { super.visitBlock(tree); if (isEmpty(tree.statements(), tree.closeCurlyBraceToken())) { context().newIssue(this, tree, MESSAGE); } }
@Override public void visitBlock(BlockTree tree) { super.visitBlock(tree); if (isEmpty(tree.statements(), tree.closeCurlyBraceToken())) { context().newIssue(this, tree, MESSAGE); } }
@Test public void empty() throws Exception { BlockTree tree = parse("{}", PHPLexicalGrammar.BLOCK); assertThat(tree.is(Kind.BLOCK)).isTrue(); assertThat(tree.statements()).isEmpty(); }
@Test public void test_findAncestorWithKind() { Tree tree = PHPParserBuilder.createParser().parse("<?= function foo() {for(;;) {} } ?>"); FunctionDeclarationTree func = (FunctionDeclarationTree) ((CompilationUnitTreeImpl) tree).script().statements().get(0); StatementTree statementTree = func.body().statements().get(0); assertThat(findAncestorWithKind(statementTree, EnumSet.of(Tree.Kind.FUNCTION_DECLARATION))).isEqualTo(func); assertThat(findAncestorWithKind(statementTree, EnumSet.of(Tree.Kind.SCRIPT, Tree.Kind.FUNCTION_DECLARATION))).isEqualTo(func); assertThat(findAncestorWithKind(statementTree, singletonList(Tree.Kind.WHILE_STATEMENT))).isNull(); assertThat(findAncestorWithKind(func, singletonList(Tree.Kind.FUNCTION_DECLARATION))).isEqualTo(func); }
private void checkBlock(Tree body, SyntaxToken prevToken) { if (body.is(Kind.BLOCK)) { BlockTree blockTree = (BlockTree)body; SyntaxToken nextToken = getFirstToken(blockTree.statements()); if (nextToken == null) { nextToken = blockTree.closeCurlyBraceToken(); } checkOpenCurlyBrace(blockTree.openCurlyBraceToken(), blockTree.closeCurlyBraceToken(), prevToken, nextToken); } }
@Test public void retrieve_symbol_by_tree() { ExpressionTree dollarAUsage = ((AssignmentExpressionTree) ((ExpressionStatementTree) ((FunctionDeclarationTree) cut.script().statements().get(5)).body().statements().get(3)).expression()).variable(); Symbol symbol = SYMBOL_MODEL.getSymbol(dollarAUsage); assertThat(symbol).isNotNull(); assertThat(symbol.name()).isEqualTo("$a"); }
@Test public void simple_declaration() throws Exception { FunctionDeclarationTree tree = parse("function f($p) {}", PHPLexicalGrammar.FUNCTION_DECLARATION); assertThat(tree.is(Kind.FUNCTION_DECLARATION)).isTrue(); assertThat(tree.functionToken().text()).isEqualTo("function"); assertThat(tree.referenceToken()).isNull(); assertThat(tree.name().text()).isEqualTo("f"); assertThat(tree.parameters().parameters()).hasSize(1); assertThat(tree.returnTypeClause()).isNull(); assertThat(tree.body().statements()).isEmpty(); }