diff --git a/src/main/java/org/openrewrite/staticanalysis/FinalizePrivateFields.java b/src/main/java/org/openrewrite/staticanalysis/FinalizePrivateFields.java index d698f8a21a..95efde2725 100644 --- a/src/main/java/org/openrewrite/staticanalysis/FinalizePrivateFields.java +++ b/src/main/java/org/openrewrite/staticanalysis/FinalizePrivateFields.java @@ -92,6 +92,16 @@ public J.VariableDeclarations visitVariableDeclarations(J.VariableDeclarations m .map(J.VariableDeclarations.NamedVariable::getVariableType) .allMatch(v -> privateFieldsToBeFinalized.contains(v)); + // makes sure the final flag is not also added to variables that have the volatile flag + for (J.VariableDeclarations.NamedVariable v : mv.getVariables()) { + if (v.getVariableType() == null) { break; } + for (Flag flag : v.getVariableType().getFlags()) { + if (flag.equals(Flag.Volatile)) { + return mv; + } + } + } + if (canAllVariablesBeFinalized) { mv = autoFormat(mv.withVariables(ListUtils.map(mv.getVariables(), v -> { JavaType.Variable type = v.getVariableType(); diff --git a/src/test/java/org/openrewrite/staticanalysis/FinalizePrivateFieldsTest.java b/src/test/java/org/openrewrite/staticanalysis/FinalizePrivateFieldsTest.java index f71a84ef2e..1aa1b33559 100644 --- a/src/test/java/org/openrewrite/staticanalysis/FinalizePrivateFieldsTest.java +++ b/src/test/java/org/openrewrite/staticanalysis/FinalizePrivateFieldsTest.java @@ -836,4 +836,24 @@ class Reproducer { ) ); } + + @Test + @Issue("https://github.com/openrewrite/rewrite-static-analysis/issues/121") + void mustNotChangeVolatileFields() { + //language=java + rewriteRun( + java( + """ + public final class Reproducer { + + private Reproducer() { + } + + private static volatile String foo = "this becomes final volatile, which is invalid"; + + } + """ + ) + ); + } }