diff --git a/src/main/java/org/openrewrite/staticanalysis/ReplaceStringBuilderWithString.java b/src/main/java/org/openrewrite/staticanalysis/ReplaceStringBuilderWithString.java index b0ff3d236..91d7de128 100644 --- a/src/main/java/org/openrewrite/staticanalysis/ReplaceStringBuilderWithString.java +++ b/src/main/java/org/openrewrite/staticanalysis/ReplaceStringBuilderWithString.java @@ -101,6 +101,21 @@ private J.Literal toStringLiteral(J.Literal input) { return input; } + // Handle character literals by stripping single quotes and wrapping in double quotes + if (input.getType() == JavaType.Primitive.Char) { + String charSource = input.getValueSource(); + if (charSource != null && charSource.length() >= 2 && + charSource.startsWith("'") && charSource.endsWith("'")) { + String charContent = charSource.substring(1, charSource.length() - 1); + String stringValue = input.getValue() != null ? String.valueOf(input.getValue()) : charContent; + String valueSource = "\"" + charContent + "\""; + return input + .withType(JavaType.Primitive.String) + .withValue(stringValue) + .withValueSource(valueSource); + } + } + String value = input.getValueSource(); return new J.Literal(randomId(), Space.EMPTY, Markers.EMPTY, value, "\"" + value + "\"", null, JavaType.Primitive.String); diff --git a/src/test/java/org/openrewrite/staticanalysis/ReplaceStringBuilderWithStringTest.java b/src/test/java/org/openrewrite/staticanalysis/ReplaceStringBuilderWithStringTest.java index 9f4a1264f..d5fe79dc0 100644 --- a/src/test/java/org/openrewrite/staticanalysis/ReplaceStringBuilderWithStringTest.java +++ b/src/test/java/org/openrewrite/staticanalysis/ReplaceStringBuilderWithStringTest.java @@ -390,4 +390,35 @@ void print(String str, String str2) { ) ); } + + @Test + void characterLiterals() { + rewriteRun( + //language=java + java( + """ + class A { + String track(Object consumer) { + return "tracked"; + } + + String method(String text, Object consumer) { + return new StringBuilder(50).append('[').append(track(consumer)).append("]: ").append(text).toString(); + } + } + """, + """ + class A { + String track(Object consumer) { + return "tracked"; + } + + String method(String text, Object consumer) { + return "[" + track(consumer) + "]: " + text; + } + } + """ + ) + ); + } }