private static boolean declaresResourceAsVariable(ListTree<Tree> resources) { return resources.stream().anyMatch(r -> r.is(Tree.Kind.VARIABLE)); }
private static Optional<Type> findInterruptingType(VariableTree parameter) { if (parameter.type().is(Tree.Kind.UNION_TYPE)) { return ((UnionTypeTree) parameter.type()).typeAlternatives().stream() .map(TypeTree::symbolType) .filter(INTERRUPTING_TYPE_PREDICATE) .findFirst(); } return Optional.of(parameter) .map(VariableTree::symbol) .map(Symbol::type) .filter(INTERRUPTING_TYPE_PREDICATE); }
private static boolean isCloneable(ClassTree classTree) { return classTree.superInterfaces().stream().map(TypeTree::symbolType).anyMatch(t -> t.is("java.lang.Cloneable")); } }
private static Optional<Type> findInterruptingType(VariableTree parameter) { if (parameter.type().is(Tree.Kind.UNION_TYPE)) { return ((UnionTypeTree) parameter.type()).typeAlternatives().stream() .map(TypeTree::symbolType) .filter(INTERRUPTING_TYPE_PREDICATE) .findFirst(); } return Optional.of(parameter) .map(VariableTree::symbol) .map(Symbol::type) .filter(INTERRUPTING_TYPE_PREDICATE); }
private static boolean isCloneable(ClassTree classTree) { return classTree.superInterfaces().stream().map(TypeTree::symbolType).anyMatch(t -> t.is("java.lang.Cloneable")); } }
public void checkClassInterfaces(ClassTree tree) { List<InterfaceTreeAndStringPairReport> reportTreeAndStringInterfaces = tree.superInterfaces().stream() .map(typeTree -> matchFunctionalInterface(typeTree.symbolType()).map(rs -> new InterfaceTreeAndStringPairReport(rs, typeTree)).orElse(null)) .filter(Objects::nonNull) .collect(Collectors.toList()); if (reportTreeAndStringInterfaces.isEmpty()) { return; } List<JavaFileScannerContext.Location> secondaryLocations = reportTreeAndStringInterfaces.stream() .map(interf -> new JavaFileScannerContext.Location("", interf.classInterface)) .collect(Collectors.toList()); reportIssue(tree.simpleName(), reportMessage(reportTreeAndStringInterfaces), secondaryLocations, null); }
public void checkClassInterfaces(ClassTree tree) { List<InterfaceTreeAndStringPairReport> reportTreeAndStringInterfaces = tree.superInterfaces().stream() .map(typeTree -> matchFunctionalInterface(typeTree.symbolType()).map(rs -> new InterfaceTreeAndStringPairReport(rs, typeTree)).orElse(null)) .filter(Objects::nonNull) .collect(Collectors.toList()); if (reportTreeAndStringInterfaces.isEmpty()) { return; } List<JavaFileScannerContext.Location> secondaryLocations = reportTreeAndStringInterfaces.stream() .map(interf -> new JavaFileScannerContext.Location("", interf.classInterface)) .collect(Collectors.toList()); reportIssue(tree.simpleName(), reportMessage(reportTreeAndStringInterfaces), secondaryLocations, null); }
@Override public void visitTryStatement(TryStatementTree tree) { boolean hasAutoCloseableSoftAssertion = tree.resourceList().stream() .map(AssertionsCompletenessCheck::resourceSymbol) .map(Symbol::type) .filter(Objects::nonNull) .anyMatch(type -> type.isSubtypeOf("org.assertj.core.api.AutoCloseableSoftAssertions")); super.visitTryStatement(tree); if (hasAutoCloseableSoftAssertion) { checkAssertJAssertAll(tree.block().closeBraceToken(), "Add one or more 'assertThat' before the end of this try block."); } }
private static Stream<ExpressionTree> extractValues(ExpressionTree argument) { ExpressionTree expression = argument; if (expression.is(Tree.Kind.ASSIGNMENT)) { expression = ((AssignmentExpressionTree) expression).expression(); } if (expression.is(Tree.Kind.NEW_ARRAY)) { return ((NewArrayTree) expression).initializers().stream() .flatMap(SpringComposedRequestMappingCheck::extractValues); } return Stream.of(expression); } }
private static Stream<ExpressionTree> extractValues(ExpressionTree argument) { ExpressionTree expression = argument; if (expression.is(Tree.Kind.ASSIGNMENT)) { expression = ((AssignmentExpressionTree) expression).expression(); } if (expression.is(Tree.Kind.NEW_ARRAY)) { return ((NewArrayTree) expression).initializers().stream() .flatMap(SpringScanDefaultPackageCheck::extractValues); } return Stream.of(expression); }
private static Stream<ExpressionTree> extractValues(ExpressionTree argument) { ExpressionTree expression = argument; if (expression.is(Tree.Kind.ASSIGNMENT)) { expression = ((AssignmentExpressionTree) expression).expression(); } if (expression.is(Tree.Kind.NEW_ARRAY)) { return ((NewArrayTree) expression).initializers().stream() .flatMap(SpringComposedRequestMappingCheck::extractValues); } return Stream.of(expression); } }
private static Stream<ExpressionTree> extractValues(ExpressionTree argument) { ExpressionTree expression = argument; if (expression.is(Tree.Kind.ASSIGNMENT)) { expression = ((AssignmentExpressionTree) expression).expression(); } if (expression.is(Tree.Kind.NEW_ARRAY)) { return ((NewArrayTree) expression).initializers().stream() .flatMap(SpringScanDefaultPackageCheck::extractValues); } return Stream.of(expression); }
@Override public void visitNode(Tree tree) { if (!hasSemantic()) { return; } TryStatementTree tryStatementTree = (TryStatementTree) tree; Set<Symbol> resourceSymbols = tryStatementTree.resourceList().stream() .map(RedundantCloseCheck::resourceSymbol) .filter(s -> !s.isUnknown()) .collect(Collectors.toSet()); if (resourceSymbols.isEmpty()) { return; } tryStatementTree.block().accept(new CloseVisitor(resourceSymbols)); }
@Override public void visitTryStatement(TryStatementTree tree) { boolean hasAutoCloseableSoftAssertion = tree.resourceList().stream() .map(AssertionsCompletenessCheck::resourceSymbol) .map(Symbol::type) .filter(Objects::nonNull) .anyMatch(type -> type.isSubtypeOf("org.assertj.core.api.AutoCloseableSoftAssertions")); super.visitTryStatement(tree); if (hasAutoCloseableSoftAssertion) { checkAssertJAssertAll(tree.block().closeBraceToken(), "Add one or more 'assertThat' before the end of this try block."); } }
private void handleClassTree(ClassTree tree) { tree.superInterfaces().stream() .filter(superInterface -> INTERFACES.stream().anyMatch(superInterface.symbolType()::is)) .forEach(this::reportIssue); TypeTree superClass = tree.superClass(); if (superClass != null && superClass.symbolType().is(GLOBAL_METHOD_SECURITY_CONFIGURATION)) { reportIssue(superClass); } checkAnnotations(tree.modifiers(), JSR_250_ANNOTATIONS); }
private void handleClassTree(ClassTree tree) { tree.superInterfaces().stream() .filter(superInterface -> INTERFACES.stream().anyMatch(superInterface.symbolType()::is)) .forEach(this::reportIssue); TypeTree superClass = tree.superClass(); if (superClass != null && superClass.symbolType().is(GLOBAL_METHOD_SECURITY_CONFIGURATION)) { reportIssue(superClass); } checkAnnotations(tree.modifiers(), JSR_250_ANNOTATIONS); }
private static boolean containsValue(Tree annotationValue, String expectedValue) { Symbol symbol; switch (annotationValue.kind()) { case IDENTIFIER: symbol = ((IdentifierTree) annotationValue).symbol(); break; case MEMBER_SELECT: symbol = ((MemberSelectExpressionTree) annotationValue).identifier().symbol(); break; case NEW_ARRAY: return ((NewArrayTree) annotationValue).initializers().stream().anyMatch(expr -> containsValue(expr, expectedValue)); default: throw new IllegalArgumentException("Unexpected tree used to parameterize annotation"); } return expectedValue.equals(symbol.name()); }
private static boolean isExcludedLiteral(Tree tree) { if (tree.is(Tree.Kind.ANNOTATION)) { AnnotationTree annotationTree = (AnnotationTree) tree; return annotationTree.annotationType().symbolType().is(SUPPRESS_WARNINGS_ANNOTATION) && annotationTree.arguments().stream().allMatch(UnusedMethodParameterCheck::isExcludedLiteral); } else if (tree.is(Tree.Kind.STRING_LITERAL)) { return EXCLUDED_WARNINGS_SUPPRESSIONS.contains(((LiteralTree) tree).value()); } else if (tree.is(Tree.Kind.NEW_ARRAY)) { return ((NewArrayTree) tree).initializers().stream().allMatch(UnusedMethodParameterCheck::isExcludedLiteral); } // If it is some type we don't expect, then return false to avoid FP. return false; }
private static boolean isExcludedLiteral(Tree tree) { if (tree.is(Tree.Kind.ANNOTATION)) { AnnotationTree annotationTree = (AnnotationTree) tree; return annotationTree.annotationType().symbolType().is(SUPPRESS_WARNINGS_ANNOTATION) && annotationTree.arguments().stream().allMatch(UnusedMethodParameterCheck::isExcludedLiteral); } else if (tree.is(Tree.Kind.STRING_LITERAL)) { return EXCLUDED_WARNINGS_SUPPRESSIONS.contains(((LiteralTree) tree).value()); } else if (tree.is(Tree.Kind.NEW_ARRAY)) { return ((NewArrayTree) tree).initializers().stream().allMatch(UnusedMethodParameterCheck::isExcludedLiteral); } // If it is some type we don't expect, then return false to avoid FP. return false; }
@Override public void visitTypeCast(TypeCastTree tree) { resolveAs(tree.type(), JavaSymbol.TYP); for (Tree bound : tree.bounds()) { resolveAs(bound, JavaSymbol.TYP); } resolveAs(tree.expression(), JavaSymbol.VAR); JavaType castType = intersectionType(getType(tree.type()), tree.bounds().stream().map(b -> ((JavaType) ((ExpressionTree) b).symbolType())).collect(Collectors.toSet()), tree); Type expressionType = tree.expression().symbolType(); if(expressionType instanceof DeferredType) { setInferedType(castType, (DeferredType) expressionType); } registerType(tree, castType); }