Skip to content

Commit 52baca5

Browse files
VB -> C#: Make interpolated strings interpolated verbatim too
1 parent 278349e commit 52baca5

File tree

3 files changed

+25
-6
lines changed

3 files changed

+25
-6
lines changed

ICSharpCode.CodeConverter/CSharp/NodesVisitor.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -832,7 +832,9 @@ public override CSharpSyntaxNode VisitLiteralExpression(VBSyntax.LiteralExpressi
832832

833833
public override CSharpSyntaxNode VisitInterpolatedStringExpression(VBSyntax.InterpolatedStringExpressionSyntax node)
834834
{
835-
return SyntaxFactory.InterpolatedStringExpression(SyntaxFactory.Token(SyntaxKind.InterpolatedStringStartToken), SyntaxFactory.List(node.Contents.Select(c => (InterpolatedStringContentSyntax)c.Accept(TriviaConvertingVisitor))));
835+
var useVerbatim = node.DescendantNodes().OfType<VBSyntax.InterpolatedStringTextSyntax>().Any(c => IsWorthBeingAVerbatimString(c.TextToken.Text));
836+
var startTokenKind = useVerbatim ? SyntaxKind.InterpolatedVerbatimStringStartToken : SyntaxKind.InterpolatedStringStartToken;
837+
return SyntaxFactory.InterpolatedStringExpression(SyntaxFactory.Token(startTokenKind), SyntaxFactory.List(node.Contents.Select(c => (InterpolatedStringContentSyntax)c.Accept(TriviaConvertingVisitor))));
836838
}
837839

838840
public override CSharpSyntaxNode VisitInterpolatedStringText(VBSyntax.InterpolatedStringTextSyntax node)

ICSharpCode.CodeConverter/CSharp/VisualBasicConverter.cs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,7 @@ static Dictionary<string, VariableDeclarationSyntax> SplitVariableDeclarations(V
8686
internal static ExpressionSyntax GetLiteralExpression(object value, string valueText = null)
8787
{
8888
if (value is string s) {
89-
var worthBeingAVerbatimString = s.IndexOfAny(new[] { '\r', '\n', '\\' }) > -1;
90-
if (worthBeingAVerbatimString) {
91-
var valueWithReplacements = s.Replace("\"", "\"\"");
92-
valueText = $"@\"{valueWithReplacements}\"";
93-
}
89+
valueText = GetStringValueText(s, valueText);
9490
return SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression,
9591
SyntaxFactory.Literal(valueText, s));
9692
}
@@ -136,6 +132,23 @@ internal static ExpressionSyntax GetLiteralExpression(object value, string value
136132
throw new ArgumentOutOfRangeException(nameof(value), value, null);
137133
}
138134

135+
internal static string GetStringValueText(string s1, string valueText)
136+
{
137+
var worthBeingAVerbatimString = IsWorthBeingAVerbatimString(s1);
138+
if (worthBeingAVerbatimString)
139+
{
140+
var valueWithReplacements = s1.Replace("\"", "\"\"");
141+
valueText = $"@\"{valueWithReplacements}\"";
142+
}
143+
144+
return valueText;
145+
}
146+
147+
internal static bool IsWorthBeingAVerbatimString(string s1)
148+
{
149+
return s1.IndexOfAny(new[] {'\r', '\n', '\\'}) > -1;
150+
}
151+
139152
/// <summary>
140153
/// https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/data-types/type-characters
141154
// https://stackoverflow.com/a/166762/1128762

Tests/CSharp/ExpressionTests.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,17 @@ public void MultilineString()
1111
TestConversionVisualBasicToCSharpWithoutComments(@"Class TestClass
1212
Private Sub TestMethod()
1313
Dim x = ""Hello\ All strings in VB are verbatim """" < that's just a single escaped quote
14+
World!""
15+
Dim y = $""Hello\ All strings in VB are verbatim """" < that's just a single escaped quote
1416
World!""
1517
End Sub
1618
End Class", @"class TestClass
1719
{
1820
private void TestMethod()
1921
{
2022
var x = @""Hello\ All strings in VB are verbatim """" < that's just a single escaped quote
23+
World!"";
24+
var y = $@""Hello\ All strings in VB are verbatim """" < that's just a single escaped quote
2125
World!"";
2226
}
2327
}");

0 commit comments

Comments
 (0)