From ff0e428c82d22d428ea4f6c064b63047547bc1d1 Mon Sep 17 00:00:00 2001 From: mahfouz72 Date: Thu, 27 Jun 2024 21:07:08 +0300 Subject: [PATCH] Issue #15014: Update LambdaParameterName format to allow unnamed lambda parameters --- ...pathRegressionLambdaParameterNameTest.java | 2 +- .../naming/LambdaParameterNameCheck.java | 4 +- .../naming/LambdaParameterNameCheck.xml | 2 +- .../naming/LambdaParameterNameCheckTest.java | 18 ++++++- ...utLambdaParameterNameSwitchExpression.java | 2 +- .../InputLambdaParameterNameUnnamed.java | 47 +++++++++++++++++++ .../LambdaParameterNameCheckExamplesTest.java | 2 +- .../checks/naming/lambdaparametername.xml | 2 +- 8 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 src/test/resources-noncompilable/com/puppycrawl/tools/checkstyle/checks/naming/lambdaparametername/InputLambdaParameterNameUnnamed.java diff --git a/src/it/java/org/checkstyle/suppressionxpathfilter/XpathRegressionLambdaParameterNameTest.java b/src/it/java/org/checkstyle/suppressionxpathfilter/XpathRegressionLambdaParameterNameTest.java index 405c8e37fec..145dcbdb59c 100644 --- a/src/it/java/org/checkstyle/suppressionxpathfilter/XpathRegressionLambdaParameterNameTest.java +++ b/src/it/java/org/checkstyle/suppressionxpathfilter/XpathRegressionLambdaParameterNameTest.java @@ -46,7 +46,7 @@ public void testDefault() throws Exception { final DefaultConfiguration moduleConfig = createModuleConfig(LambdaParameterNameCheck.class); - final String defaultPattern = "^[a-z][a-zA-Z0-9]*$"; + final String defaultPattern = "^([a-z][a-zA-Z0-9]*|_)$"; final String[] expectedViolation = { "7:44: " + getCheckMessage(LambdaParameterNameCheck.class, diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/naming/LambdaParameterNameCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/naming/LambdaParameterNameCheck.java index 3fdaf15f17e..cba01409d40 100644 --- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/naming/LambdaParameterNameCheck.java +++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/naming/LambdaParameterNameCheck.java @@ -33,7 +33,7 @@ *
  • * Property {@code format} - Sets the pattern to match valid identifiers. * Type is {@code java.util.regex.Pattern}. - * Default value is {@code "^[a-z][a-zA-Z0-9]*$"}. + * Default value is {@code "^([a-z][a-zA-Z0-9]*|_)$"}. *
  • * *

    @@ -54,7 +54,7 @@ public class LambdaParameterNameCheck extends AbstractNameCheck { /** Creates new instance of {@code LambdaParameterNameCheck}. */ public LambdaParameterNameCheck() { - super("^[a-z][a-zA-Z0-9]*$"); + super("^([a-z][a-zA-Z0-9]*|_)$"); } @Override diff --git a/src/main/resources/com/puppycrawl/tools/checkstyle/meta/checks/naming/LambdaParameterNameCheck.xml b/src/main/resources/com/puppycrawl/tools/checkstyle/meta/checks/naming/LambdaParameterNameCheck.xml index 7c519aafa81..e30b496cf87 100644 --- a/src/main/resources/com/puppycrawl/tools/checkstyle/meta/checks/naming/LambdaParameterNameCheck.xml +++ b/src/main/resources/com/puppycrawl/tools/checkstyle/meta/checks/naming/LambdaParameterNameCheck.xml @@ -8,7 +8,7 @@ Checks lambda parameter names. </p> - Sets the pattern to match valid identifiers. diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/LambdaParameterNameCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/LambdaParameterNameCheckTest.java index aac903673f8..e017e9ff489 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/LambdaParameterNameCheckTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/LambdaParameterNameCheckTest.java @@ -79,7 +79,7 @@ public void testParametersInLambda() throws Exception { @Test public void testLambdaParameterNameSwitchExpression() throws Exception { - final String pattern = "^[a-z][a-zA-Z0-9]*$"; + final String pattern = "^([a-z][a-zA-Z0-9]*|_)$"; final String[] expected = { "19:35: " + getCheckMessage(MSG_INVALID_PATTERN, "Word", pattern), @@ -94,4 +94,20 @@ public void testLambdaParameterNameSwitchExpression() throws Exception { expected); } + @Test + public void testLambdaParameterNameUnnamed() throws Exception { + + final String pattern = "^([a-z][a-zA-Z0-9]*|_)$"; + + final String[] expected = { + "30:36: " + getCheckMessage(MSG_INVALID_PATTERN, "__", pattern), + "34:36: " + getCheckMessage(MSG_INVALID_PATTERN, "_BAD", pattern), + "37:36: " + getCheckMessage(MSG_INVALID_PATTERN, "BAD_", pattern), + }; + + verifyWithInlineConfigParser( + getNonCompilablePath("InputLambdaParameterNameUnnamed.java"), + expected); + } + } diff --git a/src/test/resources-noncompilable/com/puppycrawl/tools/checkstyle/checks/naming/lambdaparametername/InputLambdaParameterNameSwitchExpression.java b/src/test/resources-noncompilable/com/puppycrawl/tools/checkstyle/checks/naming/lambdaparametername/InputLambdaParameterNameSwitchExpression.java index 1918ad6d4b3..12266b5551b 100644 --- a/src/test/resources-noncompilable/com/puppycrawl/tools/checkstyle/checks/naming/lambdaparametername/InputLambdaParameterNameSwitchExpression.java +++ b/src/test/resources-noncompilable/com/puppycrawl/tools/checkstyle/checks/naming/lambdaparametername/InputLambdaParameterNameSwitchExpression.java @@ -1,6 +1,6 @@ /* LambdaParameterName -format = (default)^[a-z][a-zA-Z0-9]*$ +format = (default)^([a-z][a-zA-Z0-9]*|_)$ */ diff --git a/src/test/resources-noncompilable/com/puppycrawl/tools/checkstyle/checks/naming/lambdaparametername/InputLambdaParameterNameUnnamed.java b/src/test/resources-noncompilable/com/puppycrawl/tools/checkstyle/checks/naming/lambdaparametername/InputLambdaParameterNameUnnamed.java new file mode 100644 index 00000000000..74b1e2759b6 --- /dev/null +++ b/src/test/resources-noncompilable/com/puppycrawl/tools/checkstyle/checks/naming/lambdaparametername/InputLambdaParameterNameUnnamed.java @@ -0,0 +1,47 @@ +/* +LambdaParameterName +format = (default)^([a-z][a-zA-Z0-9]*|_)$ + + +*/ + +//non-compiled with javac: Compilable with Java21 +package com.puppycrawl.tools.checkstyle.checks.naming.lambdaparametername; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class InputLambdaParameterNameUnnamed { + + void method(Object o) { + List numbers = Arrays.asList(1, 2, 3); + numbers = numbers.stream() + .map(_ -> 0) + .toList(); + List strings = Arrays.asList("a", "b", "c"); + + System.out.println( + strings.stream().collect(Collectors.toMap(String::toUpperCase, + _ -> "NODATA"))); // ok, unnamed lambda parameter + + System.out.println( + strings.stream().collect(Collectors.toMap(String::toUpperCase, + __ -> "NODATA"))); // violation, 'Name '__' must match.*' + + System.out.println( + strings.stream().collect(Collectors.toMap(String::toUpperCase, + _BAD -> "NODATA"))); // violation, 'Name '_BAD' must match.*' + System.out.println( + strings.stream().collect(Collectors.toMap(String::toUpperCase, + BAD_ -> "NODATA"))); // violation, 'Name 'BAD_' must match.*' + + switch (o) { + case Integer __ -> {} // ok, this is pattern variable not a lambda parameter + case String _ -> {} + default -> {} + } + + } + +} diff --git a/src/xdocs-examples/java/com/puppycrawl/tools/checkstyle/checks/naming/LambdaParameterNameCheckExamplesTest.java b/src/xdocs-examples/java/com/puppycrawl/tools/checkstyle/checks/naming/LambdaParameterNameCheckExamplesTest.java index 3854023f261..3f9e02a6ca0 100644 --- a/src/xdocs-examples/java/com/puppycrawl/tools/checkstyle/checks/naming/LambdaParameterNameCheckExamplesTest.java +++ b/src/xdocs-examples/java/com/puppycrawl/tools/checkstyle/checks/naming/LambdaParameterNameCheckExamplesTest.java @@ -34,7 +34,7 @@ protected String getPackageLocation() { @Test public void testExample1() throws Exception { final String[] expected = { - "17:11: " + getCheckMessage(MSG_INVALID_PATTERN, "S", "^[a-z][a-zA-Z0-9]*$"), + "17:11: " + getCheckMessage(MSG_INVALID_PATTERN, "S", "^([a-z][a-zA-Z0-9]*|_)$"), }; verifyWithInlineConfigParser(getPath("Example1.java"), expected); diff --git a/src/xdocs/checks/naming/lambdaparametername.xml b/src/xdocs/checks/naming/lambdaparametername.xml index bfa96704139..53135e38aed 100644 --- a/src/xdocs/checks/naming/lambdaparametername.xml +++ b/src/xdocs/checks/naming/lambdaparametername.xml @@ -28,7 +28,7 @@ format Sets the pattern to match valid identifiers. Pattern - "^[a-z][a-zA-Z0-9]*$" + "^([a-z][a-zA-Z0-9]*|_)$" 8.11