Skip to content

Commit 58e6f98

Browse files
Fix FP on S5738 when overriding deprecated interface methods
1 parent 958de77 commit 58e6f98

File tree

4 files changed

+85
-46
lines changed

4 files changed

+85
-46
lines changed

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

Lines changed: 0 additions & 43 deletions
This file was deleted.
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package checks;
2+
3+
class CallToDeprecatedCodeFlaggedForRemovalCheckSample {
4+
5+
@Deprecated
6+
String a;
7+
8+
@Deprecated(forRemoval = true)
9+
String b;
10+
11+
@Deprecated(forRemoval = true)
12+
void foo() {}
13+
14+
@Deprecated(forRemoval = false)
15+
void bar() {}
16+
17+
@Deprecated
18+
void qix() {}
19+
20+
void test() {
21+
foo(); // Noncompliant {{Remove this call to a deprecated method, it has been marked for removal.}}
22+
bar();
23+
qix();
24+
25+
new DeprecatedForRemoval(); // Noncompliant
26+
new DeprecatedDefault();
27+
28+
String s = a
29+
+ b; // Noncompliant
30+
}
31+
32+
@Deprecated(forRemoval = true)
33+
static class DeprecatedForRemoval { }
34+
35+
@Deprecated
36+
static class DeprecatedDefault { }
37+
38+
static class Extending extends CallToDeprecatedCodeFlaggedForRemovalCheckSample {
39+
@Override
40+
void foo() {} // Noncompliant {{Don't override this deprecated method, it has been marked for removal.}}
41+
42+
@Override
43+
void bar() {}
44+
}
45+
46+
interface WithDeprecatedMethod {
47+
@Deprecated(forRemoval = true)
48+
void interfaceMethod();
49+
50+
@Deprecated(forRemoval = true)
51+
default void interfaceDefault() {}
52+
}
53+
54+
static abstract class WithAbstractMethod {
55+
@Deprecated(forRemoval = true)
56+
public abstract void forOverriding();
57+
58+
@Deprecated(forRemoval = true)
59+
public void bad() {}
60+
61+
public void good() {}
62+
}
63+
64+
class Implementing extends WithAbstractMethod implements WithDeprecatedMethod {
65+
// Abstract, so overriding is unavoidable.
66+
@Override
67+
public void interfaceMethod() {} // Compliant
68+
69+
@Override
70+
public void interfaceDefault() {} // Noncompliant
71+
72+
// Abstract, so overriding is unavoidable.
73+
@Override
74+
public void forOverriding() {} // Compliant
75+
76+
@Override
77+
public void bad() {} // Noncompliant
78+
79+
@Override
80+
public void good() {}
81+
}
82+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ void checkDeprecatedIdentifier(IdentifierTree identifierTree, Symbol deprecatedS
4646

4747
@Override
4848
void checkOverridingMethod(MethodTree methodTree, List<Symbol.MethodSymbol> deprecatedSymbols) {
49-
if (deprecatedSymbols.stream().anyMatch(this::isFlaggedForRemoval)) {
49+
if (deprecatedSymbols.stream().anyMatch(methodSymbol -> isFlaggedForRemoval(methodSymbol) && !methodSymbol.isAbstract())) {
5050
reportIssue(methodTree.simpleName(), "Don't override this deprecated method, it has been marked for removal.");
5151
}
5252
}

java-checks/src/test/java/org/sonar/java/checks/CallToDeprecatedCodeMarkedForRemovalCheckTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@
1919
import org.junit.jupiter.api.Test;
2020
import org.sonar.java.checks.verifier.CheckVerifier;
2121

22-
import static org.sonar.java.checks.verifier.TestUtils.nonCompilingTestSourcesPath;
22+
import static org.sonar.java.checks.verifier.TestUtils.mainCodeSourcesPath;
2323

2424
class CallToDeprecatedCodeMarkedForRemovalCheckTest {
2525

2626
@Test
2727
void test() {
2828
CheckVerifier.newVerifier()
29-
.onFile(nonCompilingTestSourcesPath("checks/CallToDeprecatedCodeFlaggedForRemovalCheck_java9.java"))
29+
.onFile(mainCodeSourcesPath("checks/CallToDeprecatedCodeFlaggedForRemovalCheckSample.java"))
3030
// 'forRemoval' introduced in java 9
3131
.withJavaVersion(9)
3232
.withCheck(new CallToDeprecatedCodeMarkedForRemovalCheck())

0 commit comments

Comments
 (0)