From 52b16168822b0985ab520ec80bdaaad0c913dfca Mon Sep 17 00:00:00 2001 From: Lorenzo Bettini Date: Sat, 20 Apr 2024 18:12:17 +0200 Subject: [PATCH] Normalization of Line Terminators in Xbase strings --- .../compiler/AbstractXbaseEvaluationTest.java | 2 +- .../AbstractXbaseEvaluationTest.java | 2 +- .../xbase/tests/compiler/Compiler2Tests.java | 21 +++++++++++++++++++ .../xbase/compiler/LiteralsCompiler.java | 7 ++++++- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/org.eclipse.xtend.core.tests/src/org/eclipse/xtend/core/tests/compiler/AbstractXbaseEvaluationTest.java b/org.eclipse.xtend.core.tests/src/org/eclipse/xtend/core/tests/compiler/AbstractXbaseEvaluationTest.java index 2b275d87ba7..fb159da6bfe 100644 --- a/org.eclipse.xtend.core.tests/src/org/eclipse/xtend/core/tests/compiler/AbstractXbaseEvaluationTest.java +++ b/org.eclipse.xtend.core.tests/src/org/eclipse/xtend/core/tests/compiler/AbstractXbaseEvaluationTest.java @@ -909,7 +909,7 @@ public abstract class AbstractXbaseEvaluationTest extends Assert { } @Test public void testStringLiteral_03() throws Exception { - assertEvaluatesTo("lite\r\nr\\al", "'lite\r\nr\\\\al'"); + assertEvaluatesTo("lite\nr\\al", "'lite\r\nr\\\\al'"); } @Test public void testStringLiteral_04() throws Exception { diff --git a/org.eclipse.xtext.xbase.testing/src/org/eclipse/xtext/xbase/testing/evaluation/AbstractXbaseEvaluationTest.java b/org.eclipse.xtext.xbase.testing/src/org/eclipse/xtext/xbase/testing/evaluation/AbstractXbaseEvaluationTest.java index 4525cf7f404..7b5fb6cb60a 100644 --- a/org.eclipse.xtext.xbase.testing/src/org/eclipse/xtext/xbase/testing/evaluation/AbstractXbaseEvaluationTest.java +++ b/org.eclipse.xtext.xbase.testing/src/org/eclipse/xtext/xbase/testing/evaluation/AbstractXbaseEvaluationTest.java @@ -912,7 +912,7 @@ public abstract class AbstractXbaseEvaluationTest extends Assert { } @Test public void testStringLiteral_03() throws Exception { - assertEvaluatesTo("lite\r\nr\\al", "'lite\r\nr\\\\al'"); + assertEvaluatesTo("lite\nr\\al", "'lite\r\nr\\\\al'"); } @Test public void testStringLiteral_04() throws Exception { diff --git a/org.eclipse.xtext.xbase.tests/src/org/eclipse/xtext/xbase/tests/compiler/Compiler2Tests.java b/org.eclipse.xtext.xbase.tests/src/org/eclipse/xtext/xbase/tests/compiler/Compiler2Tests.java index 29d87be885c..a18a6b70a68 100644 --- a/org.eclipse.xtext.xbase.tests/src/org/eclipse/xtext/xbase/tests/compiler/Compiler2Tests.java +++ b/org.eclipse.xtext.xbase.tests/src/org/eclipse/xtext/xbase/tests/compiler/Compiler2Tests.java @@ -2190,4 +2190,25 @@ public void testLibIssue60() throws Exception { "}\n" + "return _xblockexpression;\n"); } + + @Test + public void testStringLiteralWithUnixEOL_Issue2293() throws Exception { + compilesTo( + "{var s = \"a multiline\nstring\"}", + "String s = \"a multiline\\nstring\";"); + } + + @Test + public void testStringLiteralWithWindowsEOL_Issue2293() throws Exception { + compilesTo( + "{var s = \"a multiline\r\nstring\"}", + "String s = \"a multiline\\nstring\";"); + } + + @Test + public void testStringLiteralWithEscapedWindowsEOL_Issue2293() throws Exception { + compilesTo( + "{var s = \"a multiline\\\\r\nstring\"}", + "String s = \"a multiline\\\\r\\nstring\";"); + } } diff --git a/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/compiler/LiteralsCompiler.java b/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/compiler/LiteralsCompiler.java index c3f98702de8..5ef0c774b11 100644 --- a/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/compiler/LiteralsCompiler.java +++ b/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/compiler/LiteralsCompiler.java @@ -86,7 +86,12 @@ protected void toJavaExpression(XStringLiteral literal, ITreeAppendable appendab String javaString = Strings.convertToJavaString(literal.getValue(), useUnicodeEscapes); appendable.append("Character.valueOf('").append(javaString).append("')"); } else { - String javaString = Strings.convertToJavaString(literal.getValue(), useUnicodeEscapes); + // Avoid Windows EOL characters from the original parsed text: + // this would result in different generated Java files in Windows + // see https://github.com/eclipse/xtext/issues/2293 + // This is aligned with Java text blocks' "Normalization of Line Terminators" + String normalizationOfLineTerminators = literal.getValue().replace("\r", ""); + String javaString = Strings.convertToJavaString(normalizationOfLineTerminators, useUnicodeEscapes); appendable.append("\"").append(javaString).append("\""); } }