Skip to content

Commit 03387d4

Browse files
ReplaceStringBuilderWithString should keep comments (#511)
* Initial test case for comments * Additional test cases and logic to retain comments * Apply formatter --------- Co-authored-by: Tim te Beek <[email protected]>
1 parent a55b883 commit 03387d4

File tree

3 files changed

+121
-8
lines changed

3 files changed

+121
-8
lines changed

src/main/java/org/openrewrite/staticanalysis/ChainStringBuilderAppendCalls.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import java.util.ArrayList;
2828
import java.util.List;
2929

30-
import static java.util.Collections.emptyList;
3130
import static java.util.Collections.singletonList;
3231

3332
public class ChainStringBuilderAppendCalls extends Recipe {
@@ -126,8 +125,7 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu
126125
*/
127126
public static J.Binary concatAdditionBinary(Expression left, Expression right) {
128127
J.Binary b = getAdditiveBinaryTemplate();
129-
String rightWhiteSpace = right.getPrefix().getWhitespace();
130-
Space rightPrefix = rightWhiteSpace.isEmpty() ? Space.SINGLE_SPACE : Space.build(rightWhiteSpace, emptyList());
128+
Space rightPrefix = right.getPrefix().isEmpty() ? Space.SINGLE_SPACE : right.getPrefix();
131129
return b.withPrefix(b.getLeft().getPrefix())
132130
.withLeft(left)
133131
.withRight(right.withPrefix(rightPrefix));

src/main/java/org/openrewrite/staticanalysis/ReplaceStringBuilderWithString.java

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,15 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx)
6969
Collections.reverse(arguments);
7070
arguments = adjustExpressions(method, arguments);
7171

72-
Expression additive = ChainStringBuilderAppendCalls.additiveExpression(arguments).withPrefix(method.getPrefix());
72+
Expression additive = ChainStringBuilderAppendCalls.additiveExpression(arguments);
73+
if (additive == null) {
74+
return m;
75+
}
76+
77+
if (arguments.get(0).getComments().isEmpty() || !arguments.get(0).getPrefix().getWhitespace().startsWith("\n")) {
78+
additive = additive.withPrefix(method.getPrefix());
79+
}
80+
7381
if (isAMethodSelect(method)) {
7482
additive = new J.Parentheses<>(randomId(), Space.EMPTY, Markers.EMPTY, JRightPadded.build(additive));
7583
}
@@ -111,7 +119,7 @@ private List<Expression> adjustExpressions(J.MethodInvocation method, List<Expre
111119
}
112120
}
113121
} else if (!(arg instanceof J.Identifier || arg instanceof J.Literal || arg instanceof J.MethodInvocation)) {
114-
return new J.Parentheses<>(randomId(), Space.EMPTY, Markers.EMPTY, JRightPadded.build(arg));
122+
return new J.Parentheses<>(randomId(), arg.getPrefix(), Markers.EMPTY, JRightPadded.build(arg.withPrefix(Space.EMPTY)));
115123
}
116124
return arg;
117125
});
@@ -141,8 +149,12 @@ private boolean flatMethodInvocationChain(J.MethodInvocation method, List<Expres
141149
if (args.size() != 1) {
142150
return false;
143151
} else {
144-
Space selectMethodWhiteSpace = selectMethod.getPadding().getSelect().getAfter();
145-
arguments.add(args.get(0).withPrefix(selectMethodWhiteSpace));
152+
JRightPadded<Expression> jrp = selectMethod.getPadding().getSelect();
153+
if (jrp == null) {
154+
arguments.add(args.get(0));
155+
} else {
156+
arguments.add(args.get(0).withPrefix(jrp.getAfter()));
157+
}
146158
}
147159
}
148160

@@ -153,7 +165,9 @@ private boolean flatMethodInvocationChain(J.MethodInvocation method, List<Expres
153165
if (nc.getArguments().size() == 1 && TypeUtils.isString(nc.getArguments().get(0).getType())) {
154166
arguments.add(nc.getArguments().get(0));
155167
} else if (!arguments.isEmpty()) {
156-
arguments.set(arguments.size() - 1, arguments.get(arguments.size() - 1).withPrefix(Space.EMPTY));
168+
Expression lastArgument = arguments.get(arguments.size() - 1);
169+
Space formattedPrefix = lastArgument.getComments().isEmpty() ? Space.EMPTY : lastArgument.getPrefix();
170+
arguments.set(arguments.size() - 1, lastArgument.withPrefix(formattedPrefix));
157171
}
158172
return true;
159173
}

src/test/java/org/openrewrite/staticanalysis/ReplaceStringBuilderWithStringTest.java

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,107 @@ String name() {
230230
);
231231
}
232232

233+
@Test
234+
@Issue("https://github.com/openrewrite/rewrite-static-analysis/issues/88")
235+
void retainComments() {
236+
rewriteRun(
237+
//language=java
238+
java(
239+
"""
240+
class A {
241+
void foo() {
242+
String scenarioOne = new StringBuilder()
243+
// A
244+
.append("A")
245+
// B
246+
.append("B")
247+
// C
248+
.append("C")
249+
.toString();
250+
String scenarioTwo = new StringBuilder("A")
251+
// B
252+
.append("B")
253+
// C
254+
.append("C")
255+
.toString();
256+
String scenarioThree = new StringBuilder()
257+
// A
258+
.append("A")
259+
// B
260+
.append("B")
261+
// C
262+
.append("C")
263+
// test method
264+
.append(testString())
265+
.toString();
266+
String scenarioFour = new StringBuilder()
267+
// 1 + 1
268+
.append(1 + 1)
269+
// 1
270+
.append(1)
271+
.toString();
272+
String scenarioFive = new StringBuilder()
273+
// A
274+
.append("A")
275+
// 1 + 1
276+
.append(1 + 1)
277+
// 1
278+
.append(1)
279+
.toString();
280+
}
281+
282+
String testString() {
283+
return "testString";
284+
}
285+
}
286+
""",
287+
"""
288+
class A {
289+
void foo() {
290+
String scenarioOne =
291+
// A
292+
"A" +
293+
// B
294+
"B" +
295+
// C
296+
"C";
297+
String scenarioTwo = "A" +
298+
// B
299+
"B" +
300+
// C
301+
"C";
302+
String scenarioThree =
303+
// A
304+
"A" +
305+
// B
306+
"B" +
307+
// C
308+
"C" +
309+
// test method
310+
testString();
311+
String scenarioFour =
312+
// 1 + 1
313+
String.valueOf(1 + 1) +
314+
// 1
315+
1;
316+
String scenarioFive =
317+
// A
318+
"A" +
319+
// 1 + 1
320+
(1 + 1) +
321+
// 1
322+
1;
323+
}
324+
325+
String testString() {
326+
return "testString";
327+
}
328+
}
329+
"""
330+
)
331+
);
332+
}
333+
233334
@Test
234335
void objectsGrouping() {
235336
rewriteRun(

0 commit comments

Comments
 (0)