Browse Source

Fix #1497: do not insert newlines inside string interpolation expressions.

pull/1505/head
Siegfried Pammer 6 years ago
parent
commit
7553c120a5
  1. 5
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/CS6_StringInterpolation.cs
  2. 14
      ICSharpCode.Decompiler/CSharp/OutputVisitor/CSharpOutputVisitor.cs

5
ICSharpCode.Decompiler.Tests/TestCases/Pretty/CS6_StringInterpolation.cs

@ -97,6 +97,11 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -97,6 +97,11 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
RequiresCast((IFormattable)$"\ta{$"a{args.Length}" == args[0]}");
}
public void Issue1497(string[] args)
{
Console.WriteLine($"args[0]: {args[0].Trim(':').Trim('&').Trim(':').Trim('&')} asdf {args.Length:x} test");
}
public void RequiresCast(string value)
{
}

14
ICSharpCode.Decompiler/CSharp/OutputVisitor/CSharpOutputVisitor.cs

@ -292,16 +292,19 @@ namespace ICSharpCode.Decompiler.CSharp.OutputVisitor @@ -292,16 +292,19 @@ namespace ICSharpCode.Decompiler.CSharp.OutputVisitor
return callChainLength;
}
protected virtual void InsertNewLineWhenInMethodCallChain(MemberReferenceExpression expr)
protected virtual bool InsertNewLineWhenInMethodCallChain(MemberReferenceExpression expr)
{
int callChainLength = GetCallChainLengthLimited(expr);
if (callChainLength < 3) return;
if (callChainLength < 3) return false;
if (expr.GetParent(n => n is Statement || n is LambdaExpression || n is InterpolatedStringContent) is InterpolatedStringContent)
return false;
if (callChainLength == 3)
writer.Indent();
writer.NewLine();
isAtStartOfLine = true;
isAfterSpace = false;
return true;
}
protected virtual void OpenBrace(BraceStyle style)
@ -899,13 +902,12 @@ namespace ICSharpCode.Decompiler.CSharp.OutputVisitor @@ -899,13 +902,12 @@ namespace ICSharpCode.Decompiler.CSharp.OutputVisitor
{
StartNode(memberReferenceExpression);
memberReferenceExpression.Target.AcceptVisitor(this);
InsertNewLineWhenInMethodCallChain(memberReferenceExpression);
bool insertedNewLine = InsertNewLineWhenInMethodCallChain(memberReferenceExpression);
WriteToken(Roles.Dot);
WriteIdentifier(memberReferenceExpression.MemberNameToken);
WriteTypeArguments(memberReferenceExpression.TypeArguments);
if (!(memberReferenceExpression.Parent is InvocationExpression)) {
if (GetCallChainLengthLimited(memberReferenceExpression) >= 3)
writer.Unindent();
if (insertedNewLine) {
writer.Unindent();
}
EndNode(memberReferenceExpression);
}

Loading…
Cancel
Save