From 52b16168822b0985ab520ec80bdaaad0c913dfca Mon Sep 17 00:00:00 2001 From: Lorenzo Bettini Date: Sat, 20 Apr 2024 18:12:17 +0200 Subject: [PATCH 1/9] 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("\""); } } From 4716d469350ab61b1ebdde1923436db234db9022 Mon Sep 17 00:00:00 2001 From: Lorenzo Bettini Date: Sat, 20 Apr 2024 18:36:32 +0200 Subject: [PATCH 2/9] updated XbaseInterpreter accordingly --- .../eclipse/xtext/xbase/interpreter/impl/XbaseInterpreter.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/interpreter/impl/XbaseInterpreter.java b/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/interpreter/impl/XbaseInterpreter.java index f8d1e8ac0da..de19f728893 100644 --- a/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/interpreter/impl/XbaseInterpreter.java +++ b/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/interpreter/impl/XbaseInterpreter.java @@ -323,7 +323,8 @@ protected Object _doEvaluate(XStringLiteral literal, IEvaluationContext context, if (type != null && (type.isType(Character.TYPE) || type.isType(Character.class))) { return literal.getValue().charAt(0); } - return literal.getValue(); + // see org.eclipse.xtext.xbase.compiler.LiteralsCompiler.toJavaExpression(XStringLiteral, ITreeAppendable, boolean) + return literal.getValue().replace("\r", ""); } /** From e9228d2412e1085b0f979c360dfd98537ea9e2d8 Mon Sep 17 00:00:00 2001 From: Lorenzo Bettini Date: Mon, 22 Apr 2024 14:03:02 +0200 Subject: [PATCH 3/9] use Strings.toUnixLineSeparator --- .../xtext/xbase/tests/compiler/Compiler2Tests.java | 10 +++++----- .../eclipse/xtext/xbase/compiler/LiteralsCompiler.java | 2 +- .../xtext/xbase/interpreter/impl/XbaseInterpreter.java | 3 ++- 3 files changed, 8 insertions(+), 7 deletions(-) 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 a18a6b70a68..9b13b56fc60 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 @@ -2201,14 +2201,14 @@ public void testStringLiteralWithUnixEOL_Issue2293() throws Exception { @Test public void testStringLiteralWithWindowsEOL_Issue2293() throws Exception { compilesTo( - "{var s = \"a multiline\r\nstring\"}", - "String s = \"a multiline\\nstring\";"); + "{var s = \"a multiline\r\nstring\\r\\nstring\"}", + "String s = \"a multiline\\nstring\\nstring\";"); } @Test - public void testStringLiteralWithEscapedWindowsEOL_Issue2293() throws Exception { + public void testStringLiteralWithCarriageReturn_Issue2293() throws Exception { compilesTo( - "{var s = \"a multiline\\\\r\nstring\"}", - "String s = \"a multiline\\\\r\\nstring\";"); + "{\"astring\".toString.replace(\"\\r\", \"\");}", + "return \"astring\".toString().replace(\"\\r\", \"\");"); } } 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 5ef0c774b11..c528982ee35 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 @@ -90,7 +90,7 @@ protected void toJavaExpression(XStringLiteral literal, ITreeAppendable appendab // 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 normalizationOfLineTerminators = Strings.toUnixLineSeparator(literal.getValue()); String javaString = Strings.convertToJavaString(normalizationOfLineTerminators, useUnicodeEscapes); appendable.append("\"").append(javaString).append("\""); } diff --git a/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/interpreter/impl/XbaseInterpreter.java b/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/interpreter/impl/XbaseInterpreter.java index de19f728893..7539da3e4aa 100644 --- a/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/interpreter/impl/XbaseInterpreter.java +++ b/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/interpreter/impl/XbaseInterpreter.java @@ -52,6 +52,7 @@ import org.eclipse.xtext.nodemodel.util.NodeModelUtils; import org.eclipse.xtext.util.CancelIndicator; import org.eclipse.xtext.util.ReflectionUtil; +import org.eclipse.xtext.util.Strings; import org.eclipse.xtext.xbase.XAbstractFeatureCall; import org.eclipse.xtext.xbase.XAssignment; import org.eclipse.xtext.xbase.XBasicForLoopExpression; @@ -324,7 +325,7 @@ protected Object _doEvaluate(XStringLiteral literal, IEvaluationContext context, return literal.getValue().charAt(0); } // see org.eclipse.xtext.xbase.compiler.LiteralsCompiler.toJavaExpression(XStringLiteral, ITreeAppendable, boolean) - return literal.getValue().replace("\r", ""); + return Strings.toUnixLineSeparator(literal.getValue()); } /** From 15ffadeeeb357dc7c570004130cfb81ddfdc21eb Mon Sep 17 00:00:00 2001 From: Lorenzo Bettini Date: Mon, 22 Apr 2024 18:53:42 +0200 Subject: [PATCH 4/9] improved test --- .../org/eclipse/xtext/xbase/tests/compiler/Compiler2Tests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 9b13b56fc60..7e4c5483991 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 @@ -2201,7 +2201,7 @@ public void testStringLiteralWithUnixEOL_Issue2293() throws Exception { @Test public void testStringLiteralWithWindowsEOL_Issue2293() throws Exception { compilesTo( - "{var s = \"a multiline\r\nstring\\r\\nstring\"}", + "{var s = \"a multiline\r\nstring\r\nstring\"}", "String s = \"a multiline\\nstring\\nstring\";"); } From f65df0c661dd2d2fc79919202760e2ff245c41f4 Mon Sep 17 00:00:00 2001 From: Lorenzo Bettini Date: Mon, 22 Apr 2024 18:54:11 +0200 Subject: [PATCH 5/9] remove Windows EOLs directly from the model --- .../xbase/compiler/LiteralsCompiler.java | 7 +---- .../XbaseValueConverterService.java | 30 ++++++++++++++++++- .../interpreter/impl/XbaseInterpreter.java | 4 +-- 3 files changed, 31 insertions(+), 10 deletions(-) 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 c528982ee35..c3f98702de8 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,12 +86,7 @@ protected void toJavaExpression(XStringLiteral literal, ITreeAppendable appendab String javaString = Strings.convertToJavaString(literal.getValue(), useUnicodeEscapes); appendable.append("Character.valueOf('").append(javaString).append("')"); } else { - // 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 = Strings.toUnixLineSeparator(literal.getValue()); - String javaString = Strings.convertToJavaString(normalizationOfLineTerminators, useUnicodeEscapes); + String javaString = Strings.convertToJavaString(literal.getValue(), useUnicodeEscapes); appendable.append("\"").append(javaString).append("\""); } } diff --git a/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/conversion/XbaseValueConverterService.java b/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/conversion/XbaseValueConverterService.java index b4acf20fc2e..22fd0b5a46f 100644 --- a/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/conversion/XbaseValueConverterService.java +++ b/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/conversion/XbaseValueConverterService.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011 itemis AG (http://www.itemis.eu) and others. + * Copyright (c) 2011, 2024 itemis AG (http://www.itemis.eu) and others. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at * http://www.eclipse.org/legal/epl-2.0. @@ -19,6 +19,7 @@ import org.eclipse.xtext.conversion.impl.KeywordAlternativeConverter; import org.eclipse.xtext.conversion.impl.KeywordBasedValueConverter; import org.eclipse.xtext.conversion.impl.QualifiedNameValueConverter; +import org.eclipse.xtext.conversion.impl.STRINGValueConverter; import org.eclipse.xtext.nodemodel.INode; import org.eclipse.xtext.util.Strings; @@ -34,6 +35,8 @@ *

Clients, who extend Xbase should inherit from this value converter service.

* * @author Sebastian Zarnekow - Initial contribution and API + * @author Lorenzo Bettini - remove Windows EOLs from string literals, + * https://github.com/eclipse/xtext/issues/2293 */ @Singleton public class XbaseValueConverterService extends DefaultTerminalConverters { @@ -251,4 +254,29 @@ public Integer toValue(String string, INode node) { return super.toValue(withoutUnderscore, node); } } + + @Inject + private WindowsEOLsAwareSTRINGValueConverter windowsEOLsAwareSTRINGValueConverter; + + @Override + @ValueConverter(rule = "STRING") + public IValueConverter STRING() { + return windowsEOLsAwareSTRINGValueConverter; + } + + /** + * 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" + * + * @author Lorenzo Bettini - Initial contribution and API + * @since 2.35 + */ + public static class WindowsEOLsAwareSTRINGValueConverter extends STRINGValueConverter { + @Override + public String toValue(String string, INode node) { + return Strings.toUnixLineSeparator(super.toValue(string, node)); + } + } } diff --git a/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/interpreter/impl/XbaseInterpreter.java b/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/interpreter/impl/XbaseInterpreter.java index 7539da3e4aa..f8d1e8ac0da 100644 --- a/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/interpreter/impl/XbaseInterpreter.java +++ b/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/interpreter/impl/XbaseInterpreter.java @@ -52,7 +52,6 @@ import org.eclipse.xtext.nodemodel.util.NodeModelUtils; import org.eclipse.xtext.util.CancelIndicator; import org.eclipse.xtext.util.ReflectionUtil; -import org.eclipse.xtext.util.Strings; import org.eclipse.xtext.xbase.XAbstractFeatureCall; import org.eclipse.xtext.xbase.XAssignment; import org.eclipse.xtext.xbase.XBasicForLoopExpression; @@ -324,8 +323,7 @@ protected Object _doEvaluate(XStringLiteral literal, IEvaluationContext context, if (type != null && (type.isType(Character.TYPE) || type.isType(Character.class))) { return literal.getValue().charAt(0); } - // see org.eclipse.xtext.xbase.compiler.LiteralsCompiler.toJavaExpression(XStringLiteral, ITreeAppendable, boolean) - return Strings.toUnixLineSeparator(literal.getValue()); + return literal.getValue(); } /** From ab12bd6c081d770e12148479a3d7c45fd6e81b2a Mon Sep 17 00:00:00 2001 From: Lorenzo Bettini Date: Tue, 23 Apr 2024 09:07:15 +0200 Subject: [PATCH 6/9] remove Windows EOL from the model before using the inherited converter --- .../xtext/xbase/tests/compiler/Compiler2Tests.java | 14 ++++++++++++++ .../conversion/XbaseValueConverterService.java | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) 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 7e4c5483991..d63c335fd6f 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 @@ -2211,4 +2211,18 @@ public void testStringLiteralWithCarriageReturn_Issue2293() throws Exception { "{\"astring\".toString.replace(\"\\r\", \"\");}", "return \"astring\".toString().replace(\"\\r\", \"\");"); } + + @Test + public void testStringLiteralWithCarriageReturn2_Issue2293() throws Exception { + compilesTo( + "{\"astring\".toString.replaceAll(\"\\r?\\n\", \"\\n\");}", + "return \"astring\".toString().replaceAll(\"\\r?\\n\", \"\\n\");"); + } + + @Test + public void testStringLiteralWithCarriageReturn3_Issue2293() throws Exception { + compilesTo( + "{\"astring\".toString.replaceAll(\"\\r\\n\", \"\\n\");}", + "return \"astring\".toString().replaceAll(\"\\r\\n\", \"\\n\");"); + } } diff --git a/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/conversion/XbaseValueConverterService.java b/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/conversion/XbaseValueConverterService.java index 22fd0b5a46f..0a6e4907cd1 100644 --- a/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/conversion/XbaseValueConverterService.java +++ b/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/conversion/XbaseValueConverterService.java @@ -276,7 +276,7 @@ public IValueConverter STRING() { public static class WindowsEOLsAwareSTRINGValueConverter extends STRINGValueConverter { @Override public String toValue(String string, INode node) { - return Strings.toUnixLineSeparator(super.toValue(string, node)); + return super.toValue(Strings.toUnixLineSeparator(string), node); } } } From 5f7f13c51bdb81dc980fb50ac88dfa766efcf488 Mon Sep 17 00:00:00 2001 From: Lorenzo Bettini Date: Tue, 23 Apr 2024 11:27:35 +0200 Subject: [PATCH 7/9] allow for the custom Xbase converter to be further customized,e.g.,Xtend --- .../xtend/core/XtendRuntimeModule.java | 1 + .../core/conversion/StringValueConverter.java | 4 +-- .../xbase/DefaultXbaseRuntimeModule.java | 10 ++++++- .../conversion/XbaseStringValueConverter.java | 29 +++++++++++++++++++ .../XbaseValueConverterService.java | 25 ---------------- 5 files changed, 41 insertions(+), 28 deletions(-) create mode 100644 org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/conversion/XbaseStringValueConverter.java diff --git a/org.eclipse.xtend.core/src/org/eclipse/xtend/core/XtendRuntimeModule.java b/org.eclipse.xtend.core/src/org/eclipse/xtend/core/XtendRuntimeModule.java index 9db22686160..20f3a00271e 100644 --- a/org.eclipse.xtend.core/src/org/eclipse/xtend/core/XtendRuntimeModule.java +++ b/org.eclipse.xtend.core/src/org/eclipse/xtend/core/XtendRuntimeModule.java @@ -296,6 +296,7 @@ public Class b return IntUnderscoreValueConverter.class; } + @Override public Class bindSTRINGValueConverter() { return StringValueConverter.class; } diff --git a/org.eclipse.xtend.core/src/org/eclipse/xtend/core/conversion/StringValueConverter.java b/org.eclipse.xtend.core/src/org/eclipse/xtend/core/conversion/StringValueConverter.java index 4971ffbfde9..0ecb58fcaf5 100644 --- a/org.eclipse.xtend.core/src/org/eclipse/xtend/core/conversion/StringValueConverter.java +++ b/org.eclipse.xtend.core/src/org/eclipse/xtend/core/conversion/StringValueConverter.java @@ -12,14 +12,14 @@ import org.antlr.runtime.TokenSource; import org.eclipse.xtend.core.parser.antlr.internal.FlexerFactory; -import org.eclipse.xtext.conversion.impl.STRINGValueConverter; +import org.eclipse.xtext.xbase.conversion.XbaseStringValueConverter; import com.google.inject.Inject; /** * @author Sebastian Zarnekow - Initial contribution and API */ -public class StringValueConverter extends STRINGValueConverter { +public class StringValueConverter extends XbaseStringValueConverter { @Inject private FlexerFactory flexerFactory; diff --git a/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/DefaultXbaseRuntimeModule.java b/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/DefaultXbaseRuntimeModule.java index 3e4c35f1c68..ae5e594c770 100644 --- a/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/DefaultXbaseRuntimeModule.java +++ b/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/DefaultXbaseRuntimeModule.java @@ -10,6 +10,7 @@ import org.eclipse.xtext.common.types.DefaultCommonTypesRuntimeModule; import org.eclipse.xtext.conversion.IValueConverterService; +import org.eclipse.xtext.conversion.impl.STRINGValueConverter; import org.eclipse.xtext.debug.IStratumBreakpointSupport; import org.eclipse.xtext.documentation.IJavaDocTypeReferenceProvider; import org.eclipse.xtext.findReferences.TargetURICollector; @@ -39,6 +40,7 @@ import org.eclipse.xtext.xbase.annotations.validation.UnresolvedFeatureCallTypeAwareMessageProvider; import org.eclipse.xtext.xbase.compiler.JvmModelGenerator; import org.eclipse.xtext.xbase.compiler.output.TraceAwarePostProcessor; +import org.eclipse.xtext.xbase.conversion.XbaseStringValueConverter; import org.eclipse.xtext.xbase.conversion.XbaseValueConverterService; import org.eclipse.xtext.xbase.debug.XbaseStratumBreakpointSupport; import org.eclipse.xtext.xbase.featurecalls.IdentifiableSimpleNameProvider; @@ -242,5 +244,11 @@ public Class bindTargetURICollector() { public Class bindIJavaDocReferenceProvider() { return XbaseJavaDocTypeReferenceProvider.class; } - + + /** + * @since 2.35 + */ + public Class bindSTRINGValueConverter() { + return XbaseStringValueConverter.class; + } } diff --git a/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/conversion/XbaseStringValueConverter.java b/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/conversion/XbaseStringValueConverter.java new file mode 100644 index 00000000000..fd91de3c5ec --- /dev/null +++ b/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/conversion/XbaseStringValueConverter.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * Copyright (c) 2024 Lorenzo Bettini and others. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +package org.eclipse.xtext.xbase.conversion; + +import org.eclipse.xtext.conversion.impl.STRINGValueConverter; +import org.eclipse.xtext.nodemodel.INode; +import org.eclipse.xtext.util.Strings; + +/** + * 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" + * + * @author Lorenzo Bettini - Initial contribution and API + * @since 2.35 + */ +public class XbaseStringValueConverter extends STRINGValueConverter { + @Override + public String toValue(String string, INode node) { + return super.toValue(Strings.toUnixLineSeparator(string), node); + } +} diff --git a/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/conversion/XbaseValueConverterService.java b/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/conversion/XbaseValueConverterService.java index 0a6e4907cd1..1fbe3915b19 100644 --- a/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/conversion/XbaseValueConverterService.java +++ b/org.eclipse.xtext.xbase/src/org/eclipse/xtext/xbase/conversion/XbaseValueConverterService.java @@ -19,7 +19,6 @@ import org.eclipse.xtext.conversion.impl.KeywordAlternativeConverter; import org.eclipse.xtext.conversion.impl.KeywordBasedValueConverter; import org.eclipse.xtext.conversion.impl.QualifiedNameValueConverter; -import org.eclipse.xtext.conversion.impl.STRINGValueConverter; import org.eclipse.xtext.nodemodel.INode; import org.eclipse.xtext.util.Strings; @@ -255,28 +254,4 @@ public Integer toValue(String string, INode node) { } } - @Inject - private WindowsEOLsAwareSTRINGValueConverter windowsEOLsAwareSTRINGValueConverter; - - @Override - @ValueConverter(rule = "STRING") - public IValueConverter STRING() { - return windowsEOLsAwareSTRINGValueConverter; - } - - /** - * 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" - * - * @author Lorenzo Bettini - Initial contribution and API - * @since 2.35 - */ - public static class WindowsEOLsAwareSTRINGValueConverter extends STRINGValueConverter { - @Override - public String toValue(String string, INode node) { - return super.toValue(Strings.toUnixLineSeparator(string), node); - } - } } From 45500f769b0b73c16b06166f1ec3d4f48dd435c2 Mon Sep 17 00:00:00 2001 From: Lorenzo Bettini Date: Sat, 27 Apr 2024 14:49:36 +0200 Subject: [PATCH 8/9] renamed StringValueConverter -> XtendStringValueConverter --- .../src/org/eclipse/xtend/core/XtendRuntimeModule.java | 4 ++-- ...ngValueConverter.java => XtendStringValueConverter.java} | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) rename org.eclipse.xtend.core/src/org/eclipse/xtend/core/conversion/{StringValueConverter.java => XtendStringValueConverter.java} (92%) diff --git a/org.eclipse.xtend.core/src/org/eclipse/xtend/core/XtendRuntimeModule.java b/org.eclipse.xtend.core/src/org/eclipse/xtend/core/XtendRuntimeModule.java index 20f3a00271e..2b33da09ae7 100644 --- a/org.eclipse.xtend.core/src/org/eclipse/xtend/core/XtendRuntimeModule.java +++ b/org.eclipse.xtend.core/src/org/eclipse/xtend/core/XtendRuntimeModule.java @@ -17,7 +17,7 @@ import org.eclipse.xtend.core.compiler.XtendOutputConfigurationProvider; import org.eclipse.xtend.core.conversion.IntUnderscoreValueConverter; import org.eclipse.xtend.core.conversion.JavaIDValueConverter; -import org.eclipse.xtend.core.conversion.StringValueConverter; +import org.eclipse.xtend.core.conversion.XtendStringValueConverter; import org.eclipse.xtend.core.conversion.XtendValueConverterService; import org.eclipse.xtend.core.documentation.XtendDocumentationProvider; import org.eclipse.xtend.core.documentation.XtendFileHeaderProvider; @@ -298,7 +298,7 @@ public Class b @Override public Class bindSTRINGValueConverter() { - return StringValueConverter.class; + return XtendStringValueConverter.class; } public Class bindTokenRegionProvider() { diff --git a/org.eclipse.xtend.core/src/org/eclipse/xtend/core/conversion/StringValueConverter.java b/org.eclipse.xtend.core/src/org/eclipse/xtend/core/conversion/XtendStringValueConverter.java similarity index 92% rename from org.eclipse.xtend.core/src/org/eclipse/xtend/core/conversion/StringValueConverter.java rename to org.eclipse.xtend.core/src/org/eclipse/xtend/core/conversion/XtendStringValueConverter.java index 0ecb58fcaf5..a56ae7ca8b2 100644 --- a/org.eclipse.xtend.core/src/org/eclipse/xtend/core/conversion/StringValueConverter.java +++ b/org.eclipse.xtend.core/src/org/eclipse/xtend/core/conversion/XtendStringValueConverter.java @@ -19,14 +19,14 @@ /** * @author Sebastian Zarnekow - Initial contribution and API */ -public class StringValueConverter extends XbaseStringValueConverter { +public class XtendStringValueConverter extends XbaseStringValueConverter { @Inject private FlexerFactory flexerFactory; - + @Override protected TokenSource getTokenSource(String escapedValue) { return flexerFactory.createTokenSource(new StringReader(escapedValue)); } - + } From d7c67a38d2ac345fd935ad15f3c8732f4f5d0e16 Mon Sep 17 00:00:00 2001 From: Lorenzo Bettini Date: Mon, 29 Apr 2024 11:41:20 +0200 Subject: [PATCH 9/9] further tests in AbstractXbaseEvaluationTest --- .../tests/compiler/AbstractXbaseEvaluationTest.java | 10 +++++++++- org.eclipse.xtext.xbase.testing/META-INF/MANIFEST.MF | 2 +- .../evaluation/AbstractXbaseEvaluationTest.java | 10 +++++++++- 3 files changed, 19 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 fb159da6bfe..b95582fbd7d 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 @@ -911,7 +911,15 @@ public abstract class AbstractXbaseEvaluationTest extends Assert { @Test public void testStringLiteral_03() throws Exception { assertEvaluatesTo("lite\nr\\al", "'lite\r\nr\\\\al'"); } - + + @Test public void testStringLiteral_03_Issue_2293_01() throws Exception { + assertEvaluatesTo("lite\nr\\al", "'lite\\nr\\\\al'"); + } + + @Test public void testStringLiteral_03_Issue_2293_02() throws Exception { + assertEvaluatesTo("lite\r\nr\\al", "'lite\\r\\nr\\\\al'"); + } + @Test public void testStringLiteral_04() throws Exception { assertEvaluatesTo('\n', "{ val char x = '\n' x}"); } diff --git a/org.eclipse.xtext.xbase.testing/META-INF/MANIFEST.MF b/org.eclipse.xtext.xbase.testing/META-INF/MANIFEST.MF index 7c373ec4e77..2e8f07c6086 100644 --- a/org.eclipse.xtext.xbase.testing/META-INF/MANIFEST.MF +++ b/org.eclipse.xtext.xbase.testing/META-INF/MANIFEST.MF @@ -16,7 +16,7 @@ Bundle-ActivationPolicy: lazy Export-Package: org.eclipse.xtext.xbase.testing;version="2.35.0", org.eclipse.xtext.xbase.testing.evaluation;version="2.35.0";x-friends:="org.eclipse.xtext.xbase.tests,org.eclipse.xtext.purexbase.tests", org.eclipse.xtext.xbase.testing.typesystem;version="2.35.0";x-internal:=true, - testdata;version="2.35.0";x-friends:="org.eclipse.xtext.xbase.tests", + testdata;version="2.35.0";x-friends:="org.eclipse.xtext.xbase.tests,org.eclipse.xtend.core.tests", testdata.a;version="2.35.0";x-internal:=true, testdata.b;version="2.35.0";x-internal:=true Import-Package: org.apache.log4j;version="1.2.24" 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 7b5fb6cb60a..09a3920de39 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 @@ -914,7 +914,15 @@ public abstract class AbstractXbaseEvaluationTest extends Assert { @Test public void testStringLiteral_03() throws Exception { assertEvaluatesTo("lite\nr\\al", "'lite\r\nr\\\\al'"); } - + + @Test public void testStringLiteral_03_Issue_2293_01() throws Exception { + assertEvaluatesTo("lite\nr\\al", "'lite\\nr\\\\al'"); + } + + @Test public void testStringLiteral_03_Issue_2293_02() throws Exception { + assertEvaluatesTo("lite\r\nr\\al", "'lite\\r\\nr\\\\al'"); + } + @Test public void testStringLiteral_04() throws Exception { assertEvaluatesTo('\n', "{ val char x = '\n' x}"); }