diff --git a/java-checks-test-sources/default/src/main/java/checks/VolatileVariablesOperationsCheck.java b/java-checks-test-sources/default/src/main/java/checks/VolatileVariablesOperationsCheck.java index 422ddfa8695..c337cae61d8 100644 --- a/java-checks-test-sources/default/src/main/java/checks/VolatileVariablesOperationsCheck.java +++ b/java-checks-test-sources/default/src/main/java/checks/VolatileVariablesOperationsCheck.java @@ -109,3 +109,25 @@ void method() { value++; // Noncompliant } } + +record Vinyl(String singer, String title, int year) { + static volatile int counter = 0; + static int nonVolatile = 0; + + void method() { + counter++; // Noncompliant + nonVolatile++; + } +} + +class Container { + static volatile int counter = 0; + static int nonVolatile = 0; +} + +interface MyInterface { + default void method() { + Container.counter++; // Noncompliant + Container.nonVolatile++; + } +} diff --git a/java-checks-test-sources/default/src/main/java/checks/VolatileVariablesOperationsCheckCompactSource.java b/java-checks-test-sources/default/src/main/java/checks/VolatileVariablesOperationsCheckCompactSource.java new file mode 100644 index 00000000000..8aaac7131ed --- /dev/null +++ b/java-checks-test-sources/default/src/main/java/checks/VolatileVariablesOperationsCheckCompactSource.java @@ -0,0 +1,9 @@ +volatile int count1 = 0; +int nonVolatileCount1 = 0; +volatile boolean boo1 = false; + +void main() { + count1++; // Noncompliant {{Use an "AtomicInteger" for this field; its operations are atomic.}} + nonVolatileCount1++; + boo1 = !boo1; // Noncompliant {{Use an "AtomicBoolean" for this field; its operations are atomic.}} +} diff --git a/java-checks/src/main/java/org/sonar/java/checks/VolatileVariablesOperationsCheck.java b/java-checks/src/main/java/org/sonar/java/checks/VolatileVariablesOperationsCheck.java index a55ffbcccc6..5b34f0c27bd 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/VolatileVariablesOperationsCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/VolatileVariablesOperationsCheck.java @@ -125,13 +125,17 @@ private void reportIssueIfNotInExcludedContext(Tree tree, String recommendedType } break; case ENUM, - CLASS: - if (((ClassTree) current).simpleName() == null) { + CLASS, + INTERFACE, + RECORD, + IMPLICIT_CLASS: + if (!current.is(Tree.Kind.IMPLICIT_CLASS) && ((ClassTree) current).simpleName() == null) { return; } - // we got to a non anonymous class, we can safely raise an issue + // we got to a non-anonymous class or implicit class in compact source file, we can safely raise an issue foundClass = true; break; + } current = current.parent(); } diff --git a/java-checks/src/test/java/org/sonar/java/checks/VolatileVariablesOperationsCheckTest.java b/java-checks/src/test/java/org/sonar/java/checks/VolatileVariablesOperationsCheckTest.java index 3442a575669..1fef4c3ac37 100644 --- a/java-checks/src/test/java/org/sonar/java/checks/VolatileVariablesOperationsCheckTest.java +++ b/java-checks/src/test/java/org/sonar/java/checks/VolatileVariablesOperationsCheckTest.java @@ -30,4 +30,12 @@ void test() { .withCheck(new VolatileVariablesOperationsCheck()) .verifyIssues(); } + + @Test + void test_compact_source() { + CheckVerifier.newVerifier() + .onFile(mainCodeSourcesPath("checks/VolatileVariablesOperationsCheckCompactSource.java")) + .withCheck(new VolatileVariablesOperationsCheck()) + .verifyIssues(); + } }