From 98dc57f84040bd56af1e7636d1d272d88ae11797 Mon Sep 17 00:00:00 2001 From: martinfrancois Date: Tue, 11 Aug 2026 20:27:29 +0200 Subject: [PATCH] ReplaceStringBuilderWithString: add failing tests for argument comment and ranged append retainCommentInsideAppendArguments pins that a comment inside an append argument list survives flattening; today it is dropped. convertCharArrayRangeAppend pins flattening append(char[], int, int) to String.valueOf(char[], int, int); today the whole chain is left unchanged. Both are marked @ExpectedToFail until the recipe handles them. --- .../ReplaceStringBuilderWithStringTest.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/test/java/org/openrewrite/staticanalysis/ReplaceStringBuilderWithStringTest.java b/src/test/java/org/openrewrite/staticanalysis/ReplaceStringBuilderWithStringTest.java index e0bbed84d..b80f7122b 100644 --- a/src/test/java/org/openrewrite/staticanalysis/ReplaceStringBuilderWithStringTest.java +++ b/src/test/java/org/openrewrite/staticanalysis/ReplaceStringBuilderWithStringTest.java @@ -16,6 +16,7 @@ package org.openrewrite.staticanalysis; import org.junit.jupiter.api.Test; +import org.junitpioneer.jupiter.ExpectedToFail; import org.openrewrite.DocumentExample; import org.openrewrite.Issue; import org.openrewrite.test.RecipeSpec; @@ -582,6 +583,30 @@ String render(char[] chars) { ); } + @ExpectedToFail("Comment inside the append argument list is dropped when the chain is flattened") + @Test + void retainCommentInsideAppendArguments() { + rewriteRun( + //language=java + java( + """ + class A { + String render(char[] chars) { + return new StringBuilder().append("a").append(chars /* the array */).toString(); + } + } + """, + """ + class A { + String render(char[] chars) { + return "a" + String.valueOf(chars /* the array */); + } + } + """ + ) + ); + } + @Test void doNotChangeCharArrayRangeAppend() { rewriteRun( @@ -597,4 +622,28 @@ String render(char[] chars) { ) ); } + + @ExpectedToFail("append(char[], int, int) is not yet flattened to String.valueOf(char[], int, int); doNotChangeCharArrayRangeAppend pins the current conservative behavior") + @Test + void convertCharArrayRangeAppend() { + rewriteRun( + //language=java + java( + """ + class A { + String render(char[] chars) { + return new StringBuilder().append("a").append(chars, 0, 2).toString(); + } + } + """, + """ + class A { + String render(char[] chars) { + return "a" + String.valueOf(chars, 0, 2); + } + } + """ + ) + ); + } }