diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTLambdaExpression.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTLambdaExpression.java index 49fae5b924..df3d91f50e 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTLambdaExpression.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTLambdaExpression.java @@ -110,6 +110,13 @@ public final class ASTLambdaExpression extends AbstractJavaExpr implements Funct } + /** + * Returns the number of formal parameters of this lambda. + */ + public int getArity() { + return getParameters().size(); + } + @Override protected R acceptVisitor(JavaVisitor visitor, P data) { return visitor.visit(this, data); diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTLambdaParameter.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTLambdaParameter.java index cf5e3be93b..bae2b9c035 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTLambdaParameter.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTLambdaParameter.java @@ -41,6 +41,12 @@ public final class ASTLambdaParameter extends AbstractJavaTypeNode return visitor.visit(this, data); } + /** + * Returns the lambda that owns this parameter. + */ + public ASTLambdaExpression getOwner() { + return (ASTLambdaExpression) getParent().getParent(); + } /** * Returns the declarator ID of this formal parameter. diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/ast/LazyTypeResolver.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/ast/LazyTypeResolver.java index 9fa259f112..3b55c7af23 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/ast/LazyTypeResolver.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/ast/LazyTypeResolver.java @@ -565,6 +565,9 @@ public final class LazyTypeResolver extends JavaVisitorBase {}; // ok + Lambda l = x -> {}; // wrong form! + } + } + """) + + val (ok, wrong) = acu.descendants(ASTLambdaExpression::class.java).toList() + val t_Lambda = acu.typeDeclarations.firstOrThrow().typeMirror + + acu.withTypeDsl { + ok shouldHaveType t_Lambda + wrong shouldHaveType t_Lambda + wrong.parameters[0] shouldHaveType ts.ERROR + } + } + }) diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/ReturnEmptyCollectionRatherThanNull.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/ReturnEmptyCollectionRatherThanNull.xml index 5f90a26f72..effc4e57d1 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/ReturnEmptyCollectionRatherThanNull.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/ReturnEmptyCollectionRatherThanNull.xml @@ -191,7 +191,7 @@ import java.util.concurrent.*; import java.nio.file.Path; public class Foo { - private Map> joinFutures(Map>> map) { + private Map> joinFutures(Map>> map) { Map> joined = new HashMap<>(); for (String p : map.keySet()) { @@ -214,7 +214,7 @@ public class Foo { } // checking basic lambdas and anonymous classes as well - Callable c = a -> { return null; }; // <----- false positive here + Callable c = () -> { return null; }; // <----- false positive here Callable c2 = new Callable() { public Object call() { return null; // <----- false positive here