From 54efaf8cfebb1e64579c6a82509cfd4dfd134f87 Mon Sep 17 00:00:00 2001 From: Alban Auzeill Date: Fri, 10 Feb 2023 13:57:07 +0100 Subject: [PATCH] SONARJAVA-3995 FN S3400 should also report issues on static methods (#4308) --- .../main/java/checks/ConstantMethodCheck.java | 25 +++++++++++++++++++ .../java/checks/ConstantMethodCheck.java | 4 +-- .../org/sonar/l10n/java/rules/java/S3400.html | 8 +++++- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/java-checks-test-sources/src/main/java/checks/ConstantMethodCheck.java b/java-checks-test-sources/src/main/java/checks/ConstantMethodCheck.java index a836c5f3fb7..36d32764322 100644 --- a/java-checks-test-sources/src/main/java/checks/ConstantMethodCheck.java +++ b/java-checks-test-sources/src/main/java/checks/ConstantMethodCheck.java @@ -66,6 +66,10 @@ final long finalMethod() { return 1L; // Noncompliant } + static long staticMethod() { + return 1L; // Noncompliant + } + long noFinalMethod() { return 1L; // Compliant } @@ -87,6 +91,27 @@ String noFinalMethod() { } } + enum MyEnum { + ONE() { + int overridableMethod() { + return 1; // Compliant, override + } + }, + TWO(){ + int overridableMethod() { + return 2; // Compliant, override + } + }; + + int overridableMethod() { + return 0; // Compliant, overridable + } + + static int nonOverridableStaticMethod() { + return 0; // Noncompliant + } + } + abstract class AbstractClass { abstract void abstractMethod(); // Compliant diff --git a/java-checks/src/main/java/org/sonar/java/checks/ConstantMethodCheck.java b/java-checks/src/main/java/org/sonar/java/checks/ConstantMethodCheck.java index 1b98213d01c..819175d7617 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/ConstantMethodCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/ConstantMethodCheck.java @@ -64,13 +64,13 @@ public void visitNode(Tree tree) { private static boolean isEffectivelyFinal(MethodTree methodTree) { Tree methodParent = methodTree.parent(); - if (!(methodParent instanceof ClassTree) || methodParent.is(Tree.Kind.ANNOTATION_TYPE, Tree.Kind.INTERFACE, Kind.ENUM)) { + if (!(methodParent instanceof ClassTree) || methodParent.is(Tree.Kind.ANNOTATION_TYPE, Tree.Kind.INTERFACE)) { return false; } else if (methodParent.is(Tree.Kind.RECORD) || ((ClassTree)methodParent).symbol().isFinal()) { return true; } Symbol.MethodSymbol methodSymbol = methodTree.symbol(); - return methodSymbol.isFinal() || methodSymbol.isPrivate(); + return methodSymbol.isFinal() || methodSymbol.isPrivate() || methodSymbol.isStatic(); } private static boolean isConstant(@Nullable ExpressionTree returnedExpression) { diff --git a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3400.html b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3400.html index aa100e38350..d85d1271f74 100644 --- a/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3400.html +++ b/java-checks/src/main/resources/org/sonar/l10n/java/rules/java/S3400.html @@ -12,5 +12,11 @@

Compliant Solution

static final int BEST_NUMBER = 12;

Exceptions

-

Methods with annotations, such as @Override and Spring’s @RequestMapping, are ignored.

+

The following types of method are ignored:

+