From 0ef70bcf648bdef6656738b1bdaaafe63055e85f Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Mon, 16 Feb 2026 22:16:54 +0100 Subject: [PATCH] Prevent UseTextBlocks from dropping comments in concatenations Skip text block conversion if any comments exist in the binary expression tree, since text blocks (single J.Literal nodes) have nowhere to preserve inline comments from the middle of concatenations. --- .../java/migrate/lang/UseTextBlocks.java | 16 ++++++++++ .../java/migrate/lang/UseTextBlocksTest.java | 31 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/src/main/java/org/openrewrite/java/migrate/lang/UseTextBlocks.java b/src/main/java/org/openrewrite/java/migrate/lang/UseTextBlocks.java index ddbb3f9b57..843aa5e72b 100644 --- a/src/main/java/org/openrewrite/java/migrate/lang/UseTextBlocks.java +++ b/src/main/java/org/openrewrite/java/migrate/lang/UseTextBlocks.java @@ -100,6 +100,10 @@ public J visitBinary(J.Binary binary, ExecutionContext ctx) { return binary; // Not super.visitBinary(binary, ctx) because we don't want to visit the children } + if (containsComments(binary)) { + return binary; + } + boolean flattenable = flatAdditiveStringLiterals(binary, stringLiterals, contentSb, concatenationSb); if (!flattenable) { return super.visitBinary(binary, ctx); @@ -195,6 +199,18 @@ private boolean isEndsWithSpecialCharacters(String content) { }); } + private static boolean containsComments(Expression expression) { + if (expression instanceof J.Binary) { + J.Binary b = (J.Binary) expression; + if (!b.getPrefix().getComments().isEmpty() || + !b.getPadding().getOperator().getBefore().getComments().isEmpty()) { + return true; + } + return containsComments(b.getLeft()) || containsComments(b.getRight()); + } + return expression instanceof J.Literal && !expression.getPrefix().getComments().isEmpty(); + } + private static boolean allLiterals(Expression exp) { return isRegularStringLiteral(exp) || exp instanceof J.Binary && ((J.Binary) exp).getOperator() == J.Binary.Type.Addition && diff --git a/src/test/java/org/openrewrite/java/migrate/lang/UseTextBlocksTest.java b/src/test/java/org/openrewrite/java/migrate/lang/UseTextBlocksTest.java index 787baee40e..a5f856a724 100644 --- a/src/test/java/org/openrewrite/java/migrate/lang/UseTextBlocksTest.java +++ b/src/test/java/org/openrewrite/java/migrate/lang/UseTextBlocksTest.java @@ -256,6 +256,37 @@ class Test { ); } + @Test + void doNotDropLineComments() { + rewriteRun( + //language=java + java( + """ + class Test { + String query = "SELECT * FROM\\n" + // table query + "my_table\\n" + + "WHERE something = 1;"; + } + """ + ) + ); + } + + @Test + void doNotDropBlockComments() { + rewriteRun( + //language=java + java( + """ + class Test { + String query = "SELECT * FROM\\n" + /* table name */ "my_table\\n" + + "WHERE something = 1;"; + } + """ + ) + ); + } + @Test void preferNoChangeIfCarriageReturnInContent() { rewriteRun(