public static boolean hasUnreachableCode(Tree booleanExpr, boolean isTrue) { Tree parent = biggestTreeWithSameEvaluation(booleanExpr, isTrue); if (parent.is(Tree.Kind.IF_STATEMENT)) { IfStatementTree ifStatementTree = (IfStatementTree) parent; return !isTrue || ifStatementTree.elseStatement() != null; } // Tree.Kind.DO_STATEMENT not considered, because it is always executed at least once if (parent.is(Tree.Kind.WHILE_STATEMENT) && !isTrue) { return true; } return parent.is(Tree.Kind.CONDITIONAL_EXPRESSION); }
@Nullable private static LiteralTree getBooleanLiteral(Tree... trees) { return Arrays.stream(trees) .filter(tree -> tree.is(Kind.BOOLEAN_LITERAL)) .map(LiteralTree.class::cast) .findFirst().orElse(null); }
@Override public void visitNode(Tree tree) { if (tree.is(Tree.Kind.METHOD_INVOCATION)) { super.visitNode(tree); } else if (tree.is(Tree.Kind.METHOD)) { withinSynchronizedBlock.push(ModifiersUtils.hasModifier(((MethodTree) tree).modifiers(), Modifier.SYNCHRONIZED)); } else if (tree.is(Tree.Kind.SYNCHRONIZED_STATEMENT)) { withinSynchronizedBlock.push(true); } }
private static boolean setValueIsSameAsDefaultValue(@Nullable Object defaultValue, Tree valueSet) { if (valueSet.is(Tree.Kind.STRING_LITERAL)) { return LiteralUtils.trimQuotes(((LiteralTree) valueSet).value()).equals(defaultValue); } else if (valueSet.is(Tree.Kind.INT_LITERAL)) { Integer intLiteralValue = LiteralUtils.intLiteralValue((LiteralTree) valueSet); return intLiteralValue != null && intLiteralValue.equals(defaultValue); } return false; }
private static Optional<String> getNullCheckFromReturn(Tree statement, LambdaExpressionTree lambda) { if (statement.is(Tree.Kind.RETURN_STATEMENT)) { return getNullCheck(((ReturnStatementTree) statement).expression(), lambda); } return Optional.empty(); }
private void checkExpression(Tree reportTree, Tree expression) { Optional<String> listName = Optional.empty(); if (expression.is(Tree.Kind.IDENTIFIER)) { listName = Optional.of(((IdentifierTree) expression).name()); } else if (expression.is(Tree.Kind.MEMBER_SELECT)) { listName = Optional.of(((MemberSelectExpressionTree) expression).identifier().name()); } listName.ifPresent(list -> context.reportIssue(this, reportTree, getMessage(reportTree, list))); }
private static boolean isPartOfAnnotation(AssignmentExpressionTree tree) { Tree parent = tree.parent(); while (parent != null) { if (parent.is(Tree.Kind.ANNOTATION)) { return true; } parent = parent.parent(); } return false; }
private void reportIssue(JavaFileScannerContext.Location location) { if (location.syntaxNode.is(Tree.Kind.METHOD_INVOCATION)) { MethodInvocationTree syntaxNode = (MethodInvocationTree) location.syntaxNode; Tree tree = issueTree(syntaxNode); reportIssue(tree, "Unlock this lock along all executions paths of this method."); } }
@Override public void visitNode(Tree tree) { List<Tree> members = ((ClassTree) tree).members(); for (Tree member : members) { if (member.is(Kind.VARIABLE)) { checkVariable((VariableTree) member); } } }
@Override public void leaveNode(Tree tree) { if(tree.is(Tree.Kind.CATCH)) { CatchTree catchTree = (CatchTree) tree; caughtVariables.remove(catchTree.parameter().simpleName().name()); } }
private static Tree flowTree(Tree tree) { if (tree.is(Tree.Kind.METHOD_INVOCATION)) { ExpressionTree methodSelect = ((MethodInvocationTree) tree).methodSelect(); if (methodSelect.is(Tree.Kind.MEMBER_SELECT)) { return ((MemberSelectExpressionTree) methodSelect).identifier(); } } return tree; }
@Override public void visitNode(Tree tree) { if (hasSemantic()) { if (tree.is(Tree.Kind.METHOD_INVOCATION)) { visitMethodInvocation((MethodInvocationTree) tree); } else { visitInstanceOf((InstanceOfTree) tree); } } }
private static boolean isFinalize(MethodTree methodTree) { if ("finalize".equals(methodTree.simpleName().name())) { Tree returnType = methodTree.returnType(); if (returnType != null && returnType.is(Tree.Kind.PRIMITIVE_TYPE)) { return "void".equals(((PrimitiveTypeTree) returnType).keyword().text()); } } return false; }
@Override protected void onMethodInvocationFound(MethodInvocationTree mit) { Tree parent = mit.parent(); if (parent.is(Tree.Kind.EXPRESSION_STATEMENT) || (parent.is(Tree.Kind.VARIABLE) && ((VariableTree) parent).symbol().usages().isEmpty())) { reportIssue(parent, "Do something with the \"" + mit.symbolType().name() + "\" value returned by \"" + mit.symbol().name() + "\"."); } }
private void addBoxingIssue(Tree tree, Symbol classSymbol, Tree boxingArg) { if (boxingArg.is(Tree.Kind.IDENTIFIER)) { IdentifierTree identifier = (IdentifierTree) boxingArg; reportIssue(tree, "Remove the boxing of \"" + identifier.name() + "\"."); } else { reportIssue(tree, "Remove the boxing to \"" + classSymbol.name() + "\"."); } }
@Override public void visitNode(Tree tree) { ClassTree node = (ClassTree) tree; Symbol.TypeSymbol symbol = node.symbol(); if (isServletOrEjb(symbol)) { for (Tree member : node.members()) { if (member.is(Tree.Kind.METHOD) && ((MethodTreeImpl) member).isMainMethod()) { reportIssue(((MethodTree) member).simpleName(), "Remove this unwanted \"main\" method."); } } } }
@Override public void visitClass(ClassTree tree) { if (tree.is(Tree.Kind.CLASS) || tree.is(Tree.Kind.ENUM)) { for (Tree member : tree.members()) { if (member.is(Tree.Kind.VARIABLE) && isPublicStaticNotFinal((VariableTree) member)) { context.reportIssue(this, ((VariableTree) member).simpleName(), "Make this \"public static " + ((VariableTree) member).simpleName() + "\" field final"); } } } super.visitClass(tree); }
@Override public void visitNode(Tree tree) { if (tree.is(Tree.Kind.BLOCK, Tree.Kind.STATIC_INITIALIZER, Tree.Kind.INITIALIZER)) { BlockTree blockTree = (BlockTree) tree; checkBlockBody(blockTree.openBraceToken(), blockTree.closeBraceToken(), blockTree.body()); } else { ClassTree classTree = (ClassTree) tree; checkBlockBody(classTree.openBraceToken(), classTree.closeBraceToken(), classTree.members()); } }
private static String name(Tree tree) { if (tree.is(Tree.Kind.NEW_CLASS)) { return ((NewClassTree) tree).symbolType().name(); } MethodInvocationTree mit = (MethodInvocationTree) tree; if (mit.symbolType().isVoid()) { return mit.symbol().owner().name(); } return mit.symbolType().name(); }