@Override public void visitNode(Tree tree) { LambdaExpressionTree lambdaExpressionTree = (LambdaExpressionTree) tree; List<VariableTree> parameters = lambdaExpressionTree.parameters(); if(parameters.size() <= 2 && !lambdaExpressionTree.body().is(Tree.Kind.BLOCK)) { // ignore lambdas with one or two params and a non-block body return; } String missingTypeParameters = parameters.stream() .filter(variable -> variable.type().is(Tree.Kind.INFERED_TYPE)) .map(VariableTree::simpleName) .map(IdentifierTree::name) .map(parameterName -> "'" + parameterName + "'") .collect(Collectors.joining(", ")); if (!missingTypeParameters.isEmpty()) { reportIssue(parameters.get(0), Iterables.getLast(parameters), String.format("Specify a type for: %s", missingTypeParameters)); } } }
private static boolean nullAgainstParam(ExpressionTree o1, ExpressionTree o2, LambdaExpressionTree tree) { if (o1.is(Tree.Kind.NULL_LITERAL) && o2.is(Tree.Kind.IDENTIFIER)) { List<VariableTree> parameters = tree.parameters(); return parameters.size() == 1 && parameters.get(0).symbol().equals(((IdentifierTree) o2).symbol()); } return false; }
@Override public void visitNode(Tree tree) { LambdaExpressionTree lambdaExpressionTree = (LambdaExpressionTree) tree; List<VariableTree> parameters = lambdaExpressionTree.parameters(); if(parameters.size() <= 2 && !lambdaExpressionTree.body().is(Tree.Kind.BLOCK)) { // ignore lambdas with one or two params and a non-block body return; } String missingTypeParameters = parameters.stream() .filter(variable -> variable.type().is(Tree.Kind.INFERED_TYPE)) .map(VariableTree::simpleName) .map(IdentifierTree::name) .map(parameterName -> "'" + parameterName + "'") .collect(Collectors.joining(", ")); if (!missingTypeParameters.isEmpty()) { reportIssue(parameters.get(0), Iterables.getLast(parameters), String.format("Specify a type for: %s", missingTypeParameters)); } } }
private static boolean nullAgainstParam(ExpressionTree o1, ExpressionTree o2, LambdaExpressionTree tree) { if (o1.is(Tree.Kind.NULL_LITERAL) && o2.is(Tree.Kind.IDENTIFIER)) { List<VariableTree> parameters = tree.parameters(); return parameters.size() == 1 && parameters.get(0).symbol().equals(((IdentifierTree) o2).symbol()); } return false; }
@Override public void visitNode(Tree tree) { LambdaExpressionTree let = (LambdaExpressionTree) tree; if(let.openParenToken() != null && let.parameters().size() == 1) { VariableTree param = let.parameters().get(0); String ident = param.simpleName().name(); if(param.type().is(Tree.Kind.INFERED_TYPE)) { addIssue(param, "Remove the parentheses around the \"" + ident + "\" parameter"); } } } }
@Override public void visitLambdaExpression(LambdaExpressionTree lambdaExpressionTree) { scan(lambdaExpressionTree.parameters()); scan(lambdaExpressionTree.body()); }
private boolean isAcceptableDeferredType(DeferredType arg, JavaType formal) { AbstractTypedTree tree = arg.tree(); if(tree.is(Tree.Kind.METHOD_REFERENCE, Tree.Kind.LAMBDA_EXPRESSION) && (!formal.symbol.isFlag(Flags.INTERFACE) || !findSamMethodArgsRecursively(formal).isPresent())) { return false; } // we accept all deferred type as we will resolve this later, but reject lambdas with incorrect arity return !tree.is(Tree.Kind.LAMBDA_EXPRESSION) || ((LambdaExpressionTree) tree).parameters().size() == findSamMethodArgs(formal).size(); }
@Override public void visitLambdaExpression(LambdaExpressionTree lambdaExpressionTree) { scan(lambdaExpressionTree.parameters()); scan(lambdaExpressionTree.body()); }
@Override public void visitLambdaExpression(LambdaExpressionTree lambdaExpressionTree) { scan(lambdaExpressionTree.parameters()); scanSkippingIncrementOrDecrement(lambdaExpressionTree.body()); }
private boolean isAcceptableDeferredType(DeferredType arg, JavaType formal) { AbstractTypedTree tree = arg.tree(); if(tree.is(Tree.Kind.METHOD_REFERENCE, Tree.Kind.LAMBDA_EXPRESSION) && (!formal.symbol.isFlag(Flags.INTERFACE) || !findSamMethodArgsRecursively(formal).isPresent())) { return false; } // we accept all deferred type as we will resolve this later, but reject lambdas with incorrect arity return !tree.is(Tree.Kind.LAMBDA_EXPRESSION) || ((LambdaExpressionTree) tree).parameters().size() == findSamMethodArgs(formal).size(); }
@Override public void visitLambdaExpression(LambdaExpressionTree lambdaExpressionTree) { scan(lambdaExpressionTree.parameters()); scan(lambdaExpressionTree.body()); }
@Override public void visitLambdaExpression(LambdaExpressionTree lambdaExpressionTree) { scan(lambdaExpressionTree.parameters()); scanSkippingIncrementOrDecrement(lambdaExpressionTree.body()); }
@Override public void visitLambdaExpression(LambdaExpressionTree lambdaExpressionTree) { scan(lambdaExpressionTree.parameters()); scan(lambdaExpressionTree.body()); }
@Override public void visitNode(Tree tree) { LambdaExpressionTree let = (LambdaExpressionTree) tree; SyntaxToken openParenToken = let.openParenToken(); if (openParenToken != null && let.parameters().size() == 1) { VariableTree param = let.parameters().get(0); String identifier = param.simpleName().name(); if (param.type().is(Tree.Kind.INFERED_TYPE)) { reportIssue(openParenToken, "Remove the parentheses around the \"" + identifier + "\" parameter" + context.getJavaVersion().java8CompatibilityMessage()); } } } }
@Override public void visitNode(Tree tree) { LambdaExpressionTree let = (LambdaExpressionTree) tree; SyntaxToken openParenToken = let.openParenToken(); if (openParenToken != null && let.parameters().size() == 1) { VariableTree param = let.parameters().get(0); String identifier = param.simpleName().name(); if (param.type().is(Tree.Kind.INFERED_TYPE)) { reportIssue(openParenToken, "Remove the parentheses around the \"" + identifier + "\" parameter" + context.getJavaVersion().java8CompatibilityMessage()); } } } }
private static boolean isMethodInvocation(@Nullable Tree tree, LambdaExpressionTree lambdaTree) { if (tree != null && tree.is(Tree.Kind.METHOD_INVOCATION, Tree.Kind.NEW_CLASS)) { Arguments arguments; if(tree.is(Tree.Kind.NEW_CLASS)) { if(((NewClassTree) tree).classBody() != null) { return false; } arguments = ((NewClassTree) tree).arguments(); } else { MethodInvocationTree mit = (MethodInvocationTree) tree; if (hasMethodInvocationInMethodSelect(mit) || hasNonFinalFieldInMethodSelect(mit)) { return false; } arguments = mit.arguments(); } List<VariableTree> parameters = lambdaTree.parameters(); return matchingParameters(parameters, arguments) || (arguments.isEmpty() && isNoArgMethodInvocationFromLambdaParam(tree, parameters)); } return false; }
private static boolean isMethodInvocation(@Nullable Tree tree, LambdaExpressionTree lambdaTree) { if (tree != null && tree.is(Tree.Kind.METHOD_INVOCATION, Tree.Kind.NEW_CLASS)) { Arguments arguments; if(tree.is(Tree.Kind.NEW_CLASS)) { if(((NewClassTree) tree).classBody() != null) { return false; } arguments = ((NewClassTree) tree).arguments(); } else { MethodInvocationTree mit = (MethodInvocationTree) tree; if (hasMethodInvocationInMethodSelect(mit) || hasNonFinalFieldInMethodSelect(mit)) { return false; } arguments = mit.arguments(); } List<VariableTree> parameters = lambdaTree.parameters(); return matchingParameters(parameters, arguments) || (arguments.isEmpty() && isNoArgMethodInvocationFromLambdaParam(tree, parameters)); } return false; }