From 48d8ff73aadbc6d3bc283d28897bad89bb2ad5a8 Mon Sep 17 00:00:00 2001 From: "romain.birling" Date: Tue, 20 Jan 2026 16:18:41 +0100 Subject: [PATCH 1/6] Draft of SONARJAVA-5936 solution --- ...ildCardReturnParameterNestedTypeCheck.java | 26 +++++++++++++++++++ .../WildcardReturnParameterTypeCheck.java | 4 +-- .../WildcardReturnParameterTypeCheck.java | 1 - .../WildcardReturnParameterTypeCheckTest.java | 8 ++++++ 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 java-checks-test-sources/default/src/main/java/checks/WildCardReturnParameterNestedTypeCheck.java diff --git a/java-checks-test-sources/default/src/main/java/checks/WildCardReturnParameterNestedTypeCheck.java b/java-checks-test-sources/default/src/main/java/checks/WildCardReturnParameterNestedTypeCheck.java new file mode 100644 index 00000000000..b79ea4e8824 --- /dev/null +++ b/java-checks-test-sources/default/src/main/java/checks/WildCardReturnParameterNestedTypeCheck.java @@ -0,0 +1,26 @@ +package checks; + +import java.util.List; +import java.util.ArrayList; + +public class WildCardReturnParameterNestedTypeCheck { + void bar() { + foo(listOfLists()); + } + + void foo(List> listList) { + + } + + List> listOfLists() { + return new ArrayList<>(); + } + + private static class A { + } + + private static class B extends checks.A { + } +} + + diff --git a/java-checks-test-sources/default/src/main/java/checks/WildcardReturnParameterTypeCheck.java b/java-checks-test-sources/default/src/main/java/checks/WildcardReturnParameterTypeCheck.java index 1971302488b..ae8404c9fef 100644 --- a/java-checks-test-sources/default/src/main/java/checks/WildcardReturnParameterTypeCheck.java +++ b/java-checks-test-sources/default/src/main/java/checks/WildcardReturnParameterTypeCheck.java @@ -34,7 +34,7 @@ public List> getListOfClass() { // Compliant Class is ignored return null; } - public Class> getClassofList() { // Noncompliant + public Class> getClassofList() { // Compliant, nested type is ignored return null; } @@ -43,7 +43,7 @@ public List> bar() { // Noncompliant {{Remove usage of g } public List> getSomething() { // Noncompliant + extends List> getSomething() { // Compliant, skip nested wildcard return types return null; } diff --git a/java-checks/src/main/java/org/sonar/java/checks/WildcardReturnParameterTypeCheck.java b/java-checks/src/main/java/org/sonar/java/checks/WildcardReturnParameterTypeCheck.java index 386d219876b..82e0cc8b891 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/WildcardReturnParameterTypeCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/WildcardReturnParameterTypeCheck.java @@ -68,7 +68,6 @@ public void visitParameterizedType(ParameterizedTypeTree tree) { } else if (!symbolType.is("java.lang.Class") && !symbolType.isUnknown()) { typeArguments.forEach(this::reportIfWildcard); } - super.visitParameterizedType(tree); } private void reportIfWildcard(Tree tree) { diff --git a/java-checks/src/test/java/org/sonar/java/checks/WildcardReturnParameterTypeCheckTest.java b/java-checks/src/test/java/org/sonar/java/checks/WildcardReturnParameterTypeCheckTest.java index ed8352b471b..283e53ae425 100644 --- a/java-checks/src/test/java/org/sonar/java/checks/WildcardReturnParameterTypeCheckTest.java +++ b/java-checks/src/test/java/org/sonar/java/checks/WildcardReturnParameterTypeCheckTest.java @@ -39,4 +39,12 @@ void test_non_compiling() { .withCheck(new WildcardReturnParameterTypeCheck()) .verifyNoIssues(); } + + @Test + void test_nested_types() { + CheckVerifier.newVerifier() + .onFile(mainCodeSourcesPath("checks/WildCardReturnParameterNestedTypeCheck.java")) + .withCheck(new WildcardReturnParameterTypeCheck()) + .verifyNoIssues(); + } } From bfed32240335c3e72bfeb2e55196b90c33552579 Mon Sep 17 00:00:00 2001 From: "romain.birling" Date: Wed, 21 Jan 2026 15:04:39 +0100 Subject: [PATCH 2/6] Try to fix ruling tests : 1st iteration - rm fp --- .../src/test/resources/guava/java-S1452.json | 20 ++----------------- .../resources/sonar-server/java-S1452.json | 3 --- 2 files changed, 2 insertions(+), 21 deletions(-) diff --git a/its/ruling/src/test/resources/guava/java-S1452.json b/its/ruling/src/test/resources/guava/java-S1452.json index e521db15313..3f1c52144e5 100644 --- a/its/ruling/src/test/resources/guava/java-S1452.json +++ b/its/ruling/src/test/resources/guava/java-S1452.json @@ -1,8 +1,4 @@ { -"com.google.guava:guava:src/com/google/common/base/Enums.java": [ -100, -100 -], "com.google.guava:guava:src/com/google/common/cache/CacheBuilder.java": [ 767 ], @@ -16,18 +12,11 @@ 513 ], "com.google.guava:guava:src/com/google/common/collect/Maps.java": [ -106, -111, -649, -2131, -2135 +649 ], "com.google.guava:guava:src/com/google/common/collect/MinMaxPriorityQueue.java": [ 903 ], -"com.google.guava:guava:src/com/google/common/collect/Ordering.java": [ -413 -], "com.google.guava:guava:src/com/google/common/collect/RegularImmutableAsList.java": [ 49 ], @@ -47,16 +36,12 @@ "com.google.guava:guava:src/com/google/common/collect/TreeMultimap.java": [ 156 ], -"com.google.guava:guava:src/com/google/common/hash/Funnels.java": [ -169 -], "com.google.guava:guava:src/com/google/common/reflect/Element.java": [ 48 ], "com.google.guava:guava:src/com/google/common/reflect/Invokable.java": [ 67, -108, -129 +108 ], "com.google.guava:guava:src/com/google/common/reflect/Parameter.java": [ 56, @@ -67,7 +52,6 @@ 157, 238, 275, -315, 364, 387, 562, diff --git a/its/ruling/src/test/resources/sonar-server/java-S1452.json b/its/ruling/src/test/resources/sonar-server/java-S1452.json index b7b9b0ed50a..bff730ba8a2 100644 --- a/its/ruling/src/test/resources/sonar-server/java-S1452.json +++ b/its/ruling/src/test/resources/sonar-server/java-S1452.json @@ -1,8 +1,5 @@ { "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/qualitygate/EvaluationResult.java": [ 46 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/NewCoverageMeasuresStep.java": [ -131 ] } From e6434fa1c6dce23e61151eef53177a0ca78b6d6c Mon Sep 17 00:00:00 2001 From: "romain.birling" Date: Fri, 23 Jan 2026 13:10:36 +0100 Subject: [PATCH 3/6] Add test example with other datastructure from FP disappeared from its --- .../checks/WildCardReturnParameterNestedTypeCheck.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/java-checks-test-sources/default/src/main/java/checks/WildCardReturnParameterNestedTypeCheck.java b/java-checks-test-sources/default/src/main/java/checks/WildCardReturnParameterNestedTypeCheck.java index b79ea4e8824..353651d1b08 100644 --- a/java-checks-test-sources/default/src/main/java/checks/WildCardReturnParameterNestedTypeCheck.java +++ b/java-checks-test-sources/default/src/main/java/checks/WildCardReturnParameterNestedTypeCheck.java @@ -1,5 +1,6 @@ package checks; +import com.google.common.collect.Maps; import java.util.List; import java.util.ArrayList; @@ -21,6 +22,13 @@ private static class A { private static class B extends checks.A { } + + static class Entry {} + + @SuppressWarnings("unchecked") + static Function, K> keyFunction() { + return (Function) Maps.EntryFunction.KEY; + } } From 7d0f2388a24b4ca3bf4697dfc7147d4801a78738 Mon Sep 17 00:00:00 2001 From: "romain.birling" Date: Fri, 23 Jan 2026 14:00:53 +0100 Subject: [PATCH 4/6] Fix non-compiling code --- .../java/checks/WildCardReturnParameterNestedTypeCheck.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/java-checks-test-sources/default/src/main/java/checks/WildCardReturnParameterNestedTypeCheck.java b/java-checks-test-sources/default/src/main/java/checks/WildCardReturnParameterNestedTypeCheck.java index 353651d1b08..fc3518bc22d 100644 --- a/java-checks-test-sources/default/src/main/java/checks/WildCardReturnParameterNestedTypeCheck.java +++ b/java-checks-test-sources/default/src/main/java/checks/WildCardReturnParameterNestedTypeCheck.java @@ -23,11 +23,12 @@ private static class A { private static class B extends checks.A { } - static class Entry {} + static class Entry { + } @SuppressWarnings("unchecked") static Function, K> keyFunction() { - return (Function) Maps.EntryFunction.KEY; + throw new UnsupportedOperationException(); } } From 69d5e1e9d332e829908d8a8ebc7ffd727444e1e1 Mon Sep 17 00:00:00 2001 From: "romain.birling" Date: Mon, 2 Feb 2026 11:39:56 +0100 Subject: [PATCH 5/6] Address Tomasz' review --- ...eck.java => WildCardReturnParameterNestedTypeSample.java} | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) rename java-checks-test-sources/default/src/main/java/checks/{WildCardReturnParameterNestedTypeCheck.java => WildCardReturnParameterNestedTypeSample.java} (76%) diff --git a/java-checks-test-sources/default/src/main/java/checks/WildCardReturnParameterNestedTypeCheck.java b/java-checks-test-sources/default/src/main/java/checks/WildCardReturnParameterNestedTypeSample.java similarity index 76% rename from java-checks-test-sources/default/src/main/java/checks/WildCardReturnParameterNestedTypeCheck.java rename to java-checks-test-sources/default/src/main/java/checks/WildCardReturnParameterNestedTypeSample.java index fc3518bc22d..20f3a2b552b 100644 --- a/java-checks-test-sources/default/src/main/java/checks/WildCardReturnParameterNestedTypeCheck.java +++ b/java-checks-test-sources/default/src/main/java/checks/WildCardReturnParameterNestedTypeSample.java @@ -1,10 +1,9 @@ package checks; -import com.google.common.collect.Maps; import java.util.List; import java.util.ArrayList; -public class WildCardReturnParameterNestedTypeCheck { +public class WildCardReturnParameterNestedTypeSample { void bar() { foo(listOfLists()); } @@ -20,7 +19,7 @@ List> listOfLists() { private static class A { } - private static class B extends checks.A { + private static class B extends A { } static class Entry { From 0434398dc038c457fd0d03de3711a76e111dc65d Mon Sep 17 00:00:00 2001 From: "romain.birling" Date: Mon, 2 Feb 2026 11:52:23 +0100 Subject: [PATCH 6/6] Fix WildCardReturnParameterNestedTypeCheck -> WildCardReturnParameterNestedTypeSample --- .../sonar/java/checks/WildcardReturnParameterTypeCheckTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java-checks/src/test/java/org/sonar/java/checks/WildcardReturnParameterTypeCheckTest.java b/java-checks/src/test/java/org/sonar/java/checks/WildcardReturnParameterTypeCheckTest.java index 283e53ae425..69063bc75b0 100644 --- a/java-checks/src/test/java/org/sonar/java/checks/WildcardReturnParameterTypeCheckTest.java +++ b/java-checks/src/test/java/org/sonar/java/checks/WildcardReturnParameterTypeCheckTest.java @@ -43,7 +43,7 @@ void test_non_compiling() { @Test void test_nested_types() { CheckVerifier.newVerifier() - .onFile(mainCodeSourcesPath("checks/WildCardReturnParameterNestedTypeCheck.java")) + .onFile(mainCodeSourcesPath("checks/WildCardReturnParameterNestedTypeSample.java")) .withCheck(new WildcardReturnParameterTypeCheck()) .verifyNoIssues(); }