diff --git a/src/main/java/org/openrewrite/staticanalysis/ReplaceDuplicateStringLiterals.java b/src/main/java/org/openrewrite/staticanalysis/ReplaceDuplicateStringLiterals.java index 3932c31a..1f4138dd 100644 --- a/src/main/java/org/openrewrite/staticanalysis/ReplaceDuplicateStringLiterals.java +++ b/src/main/java/org/openrewrite/staticanalysis/ReplaceDuplicateStringLiterals.java @@ -31,6 +31,7 @@ import static java.util.Arrays.asList; import static java.util.Collections.emptyList; +import static java.util.Objects.requireNonNull; import static org.openrewrite.Tree.randomId; @Value @@ -71,7 +72,7 @@ public Duration getEstimatedEffortPerOccurrence() { public TreeVisitor getVisitor() { return Preconditions.check(new UsesType<>("java.lang.String", false), new JavaVisitor() { @Override - public J visit(@Nullable Tree tree, ExecutionContext ctx) { + public @Nullable J visit(@Nullable Tree tree, ExecutionContext ctx) { if (tree instanceof JavaSourceFile) { JavaSourceFile cu = (JavaSourceFile) tree; Optional sourceSet = cu.getMarkers().findFirst(JavaSourceSet.class); @@ -117,7 +118,8 @@ public J visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext ct continue; } J.Literal replaceLiteral = duplicateLiterals.get(0).withId(randomId()); - JavaTemplate template = JavaTemplate.builder("private static final String " + variableName + " = #{any(String)};").build(); + String modifiers = (classDecl.getKind() == J.ClassDeclaration.Kind.Type.Interface) ? "" : "private static final "; + JavaTemplate template = JavaTemplate.builder(modifiers + "String " + variableName + " = #{any(String)};").build(); if (classDecl.getKind() == J.ClassDeclaration.Kind.Type.Enum) { J.Block applied = template .apply(new Cursor(getCursor(), classDecl.getBody()), classDecl.getBody().getCoordinates().lastStatement(), replaceLiteral); @@ -136,7 +138,7 @@ public J visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext ct duplicateLiteralInfo = null; duplicateLiteralsMap = null; return replacements.isEmpty() ? classDecl : - new ReplaceStringLiterals(classDecl, replacements).visitNonNull(classDecl, ctx, getCursor().getParent()); + new ReplaceStringLiterals(classDecl, replacements).visitNonNull(classDecl, ctx, requireNonNull(getCursor().getParent())); } /** diff --git a/src/test/java/org/openrewrite/staticanalysis/ReplaceDuplicateStringLiteralsTest.java b/src/test/java/org/openrewrite/staticanalysis/ReplaceDuplicateStringLiteralsTest.java index c58e48d5..63b3f7a8 100644 --- a/src/test/java/org/openrewrite/staticanalysis/ReplaceDuplicateStringLiteralsTest.java +++ b/src/test/java/org/openrewrite/staticanalysis/ReplaceDuplicateStringLiteralsTest.java @@ -577,4 +577,28 @@ enum Scratch { ) ); } + + @Test + void interfaceLiteralsCannotBePrivate() { + rewriteRun( + //language=java + java( + """ + interface A { + String val1 = "value"; + String val2 = "value"; + String val3 = "value"; + } + """, + """ + interface A { + String VALUE = "value"; + String val1 = VALUE; + String val2 = VALUE; + String val3 = VALUE; + } + """ + ) + ); + } }