Skip to content

Commit 6dcc301

Browse files
SONARJAVA-6070 S1133: Fix FP for deprecated code with documented migration paths (#5529)
1 parent cf7b4bd commit 6dcc301

8 files changed

Lines changed: 27 additions & 147 deletions

File tree

its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S1133.json

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
398
1111
],
1212
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/OptionalSslConnectionFactory.java": [
13-
37,
1413
93
1514
],
1615
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Request.java": [
@@ -48,25 +47,13 @@
4847
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/ErrorHandler.java": [
4948
187
5049
],
51-
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/InetAccessHandler.java": [
52-
174,
53-
186,
54-
198,
55-
210
56-
],
57-
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionCache.java": [
58-
500
59-
],
6050
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/session/Session.java": [
6151
599,
6252
667,
6353
717,
6454
752,
6555
765
6656
],
67-
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionCache.java": [
68-
132
69-
],
7057
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionHandler.java": [
7158
140,
7259
144,

its/ruling/src/test/resources/eclipse-jetty/java-S1133.json

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
398
1111
],
1212
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/OptionalSslConnectionFactory.java": [
13-
37,
1413
93
1514
],
1615
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Request.java": [
@@ -48,25 +47,13 @@
4847
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/ErrorHandler.java": [
4948
187
5049
],
51-
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/InetAccessHandler.java": [
52-
174,
53-
186,
54-
198,
55-
210
56-
],
57-
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionCache.java": [
58-
500
59-
],
6050
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/session/Session.java": [
6151
599,
6252
667,
6353
717,
6454
752,
6555
765
6656
],
67-
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionCache.java": [
68-
132
69-
],
7057
"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/session/SessionHandler.java": [
7158
140,
7259
144,

its/ruling/src/test/resources/guava/java-S1133.json

Lines changed: 1 addition & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,4 @@
11
{
2-
"com.google.guava:guava:src/com/google/common/base/CharMatcher.java": [
3-
925
4-
],
5-
"com.google.guava:guava:src/com/google/common/base/Converter.java": [
6-
366
7-
],
8-
"com.google.guava:guava:src/com/google/common/base/Objects.java": [
9-
131,
10-
149,
11-
165,
12-
190,
13-
203
14-
],
15-
"com.google.guava:guava:src/com/google/common/cache/LoadingCache.java": [
16-
132
17-
],
182
"com.google.guava:guava:src/com/google/common/collect/ArrayTable.java": [
193
375,
204
489
@@ -133,16 +117,9 @@
133117
80
134118
],
135119
"com.google.guava:guava:src/com/google/common/collect/Iterators.java": [
136-
117,
137120
189,
138121
1252
139122
],
140-
"com.google.guava:guava:src/com/google/common/collect/MapConstraint.java": [
141-
56
142-
],
143-
"com.google.guava:guava:src/com/google/common/collect/MapConstraints.java": [
144-
53
145-
],
146123
"com.google.guava:guava:src/com/google/common/collect/MapMaker.java": [
147124
205,
148125
332,
@@ -162,51 +139,18 @@
162139
"com.google.guava:guava:src/com/google/common/collect/Ordering.java": [
163140
176
164141
],
165-
"com.google.guava:guava:src/com/google/common/collect/Range.java": [
166-
447
167-
],
168-
"com.google.guava:guava:src/com/google/common/collect/Sets.java": [
169-
518
170-
],
171142
"com.google.guava:guava:src/com/google/common/collect/UnmodifiableIterator.java": [
172143
46
173144
],
174145
"com.google.guava:guava:src/com/google/common/collect/UnmodifiableListIterator.java": [
175146
42,
176147
52
177148
],
178-
"com.google.guava:guava:src/com/google/common/hash/BloomFilter.java": [
179-
150
180-
],
181149
"com.google.guava:guava:src/com/google/common/io/ByteArrayDataOutput.java": [
182150
48
183151
],
184-
"com.google.guava:guava:src/com/google/common/io/InputSupplier.java": [
185-
34
186-
],
187-
"com.google.guava:guava:src/com/google/common/io/LittleEndianDataOutputStream.java": [
188-
74
189-
],
190-
"com.google.guava:guava:src/com/google/common/io/OutputSupplier.java": [
191-
34
192-
],
193-
"com.google.guava:guava:src/com/google/common/reflect/TypeToken.java": [
194-
415,
195-
428
196-
],
197-
"com.google.guava:guava:src/com/google/common/util/concurrent/FutureFallback.java": [
198-
41
199-
],
200152
"com.google.guava:guava:src/com/google/common/util/concurrent/Futures.java": [
201-
427,
202-
498,
203153
734,
204-
1007,
205-
1057,
206-
1824,
207-
1882
208-
],
209-
"com.google.guava:guava:src/com/google/common/util/concurrent/MoreExecutors.java": [
210-
282
154+
1824
211155
]
212156
}

its/ruling/src/test/resources/sonar-server/java-S1133.json

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
{
2-
"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/component/DefaultRubyComponentService.java": [
3-
54
4-
],
52
"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/index/IssueDoc.java": [
63
141,
74
168,
@@ -21,9 +18,5 @@
2118
],
2219
"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/ui/PageDecorations.java": [
2320
33
24-
],
25-
"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/user/UserSession.java": [
26-
119,
27-
143
2821
]
2922
}

java-checks-test-sources/default/src/main/files/non-compiling/checks/DeprecatedTagPresenceCheckSample.java

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -95,75 +95,84 @@ public void oldMethod2() { // Compliant
9595
}
9696

9797
/**
98-
* @deprecated Replaced by newMethod()
98+
* @deprecated Scheduled for removal in version 2.0
9999
*/
100100
public void oldMethod3() { // Compliant
101101
}
102102

103103
/**
104-
* @deprecated Scheduled for removal in version 2.0
104+
* @deprecated Use newApi() instead.
105105
*/
106106
public void oldMethod4() { // Compliant
107107
}
108108

109109
/**
110-
* @deprecated Use newApi() instead.
110+
* @deprecated See {@link NewApi#betterMethod}
111111
*/
112-
public void oldMethod5() { // Compliant
112+
public void oldMethod5() { // Noncompliant
113113
}
114114

115115
/**
116-
* @deprecated See {@link NewApi#betterMethod}
116+
* @deprecated Prefer using modernMethod()
117117
*/
118-
public void oldMethod6() { // Compliant
118+
public void oldMethod6() { // Noncompliant
119119
}
120120

121121
/**
122-
* @deprecated Prefer using modernMethod()
122+
* @deprecated Migrate to the new API
123123
*/
124-
public void oldMethod7() { // Compliant
124+
public void oldMethod7() { // Noncompliant
125125
}
126126

127127
/**
128-
* @deprecated Migrate to the new API
128+
* @deprecated Removed in version 3.0
129129
*/
130130
public void oldMethod8() { // Compliant
131131
}
132132

133133
/**
134-
* @deprecated Removed in version 3.0
134+
* @deprecated To be removed in future releases
135135
*/
136136
public void oldMethod9() { // Compliant
137137
}
138138

139139
/**
140140
* @deprecated To be removed in future releases
141141
*/
142-
public void oldMethod10() { // Compliant
142+
@Deprecated
143+
public void methodWithDeprecatedAnnotationAndTag() { // Compliant
143144
}
144145

145146
/**
146147
* @deprecated deprecated since version 1.5, use newMethod() instead
147148
*/
148-
public void oldMethod11() { // Compliant
149+
public void oldMethod10() { // Compliant
149150
}
150151

151152
/**
152153
* @deprecated This is old and not useful
153154
*/
154-
public void oldMethod12() { // Noncompliant
155+
public void oldMethod11() { // Noncompliant
155156
}
156157

157158
/**
158159
* @deprecated
159160
*/
161+
public void oldMethod12() { // Noncompliant
162+
}
163+
164+
/**
165+
* Some javadoc
166+
* @deprecated This method is outdated
167+
*/
160168
public void oldMethod13() { // Noncompliant
161169
}
162170

163171
/**
164172
* Some javadoc
165173
* @deprecated This method is outdated
166174
*/
175+
@Deprecated
167176
public void oldMethod14() { // Noncompliant
168177
}
169178

java-checks/src/main/java/org/sonar/java/checks/DeprecatedTagPresenceCheck.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
import static org.sonar.java.checks.helpers.DeprecatedCheckerHelper.deprecatedAnnotation;
2929
import static org.sonar.java.checks.helpers.DeprecatedCheckerHelper.getAnnotationAttributeValue;
30+
import static org.sonar.java.checks.helpers.DeprecatedCheckerHelper.hasJavadocDeprecatedTag;
3031
import static org.sonar.java.checks.helpers.DeprecatedCheckerHelper.hasJavadocDeprecatedTagWithoutLegitimateDocumentation;
3132
import static org.sonar.java.checks.helpers.DeprecatedCheckerHelper.reportTreeForDeprecatedTree;
3233

@@ -40,7 +41,7 @@ public List<Tree.Kind> nodesToVisit() {
4041

4142
@Override
4243
public void visitNode(Tree tree) {
43-
if (hasDeprecatedAnnotation(tree) || hasJavadocDeprecatedTagWithoutLegitimateDocumentation(tree)) {
44+
if ((hasDeprecatedAnnotation(tree) && !hasJavadocDeprecatedTag(tree)) || hasJavadocDeprecatedTagWithoutLegitimateDocumentation(tree)) {
4445
reportIssue(reportTreeForDeprecatedTree(tree), "Do not forget to remove this deprecated code someday.");
4546
}
4647
}

java-checks/src/main/java/org/sonar/java/checks/helpers/DeprecatedCheckerHelper.java

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,6 @@ public class DeprecatedCheckerHelper {
4343
private static final Kind[] CLASS_KINDS = PublicApiChecker.classKinds();
4444
private static final Kind[] METHOD_KINDS = PublicApiChecker.methodKinds();
4545

46-
private static final Set<String> MIGRATION_GUIDANCE_KEYWORDS = Set.of(
47-
"replaced by",
48-
"see ",
49-
"prefer",
50-
"migrate to",
51-
"{@link"
52-
);
53-
5446
private static final Set<String> REMOVAL_TIMELINE_TERMS = Set.of(
5547
"will be removed in",
5648
"removed in version",
@@ -108,8 +100,7 @@ private static String extractDeprecatedTagContent(String javadoc) {
108100

109101
private static boolean hasMigrationGuidance(String deprecatedContent) {
110102
String lowerContent = deprecatedContent.toLowerCase(Locale.ROOT);
111-
return (lowerContent.contains("use") && (lowerContent.contains("instead") || lowerContent.contains("new")))
112-
|| MIGRATION_GUIDANCE_KEYWORDS.stream().anyMatch(lowerContent::contains);
103+
return lowerContent.contains("use") && (lowerContent.contains("instead") || lowerContent.contains("new"));
113104
}
114105

115106
private static boolean hasRemovalTimeline(String deprecatedContent) {

java-checks/src/test/java/org/sonar/java/checks/helpers/DeprecatedCheckerHelperTest.java

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ void hasLegitimateDeprecationDocumentation(String javadoc, String description, b
6060

6161
private static Stream<Arguments> legitimateDeprecationTestCases() {
6262
return Stream.of(
63-
// Migration guidance - should be legitimate (true)
63+
// Migration guidance should be legitimate (true)
6464
Arguments.of(
6565
"""
6666
/**
@@ -77,38 +77,6 @@ private static Stream<Arguments> legitimateDeprecationTestCases() {
7777
"Migration guidance with {@link}",
7878
true
7979
),
80-
Arguments.of(
81-
"""
82-
/**
83-
* @deprecated Replaced by newMethod()
84-
*/""",
85-
"Migration guidance with 'replaced by'",
86-
true
87-
),
88-
Arguments.of(
89-
"""
90-
/**
91-
* @deprecated See {@link NewApi#betterMethod}
92-
*/""",
93-
"Migration guidance with 'see'",
94-
true
95-
),
96-
Arguments.of(
97-
"""
98-
/**
99-
* @deprecated Prefer using modernMethod()
100-
*/""",
101-
"Migration guidance with 'prefer'",
102-
true
103-
),
104-
Arguments.of(
105-
"""
106-
/**
107-
* @deprecated Migrate to the new API
108-
*/""",
109-
"Migration guidance with 'migrate to'",
110-
true
111-
),
11280
Arguments.of(
11381
"""
11482
/**

0 commit comments

Comments
 (0)