Browse Source

Fix #267: Improve formatting for long sequences of method calls

pull/940/merge
Siegfried Pammer 8 years ago
parent
commit
8fe53a2758
  1. 31
      ICSharpCode.Decompiler/CSharp/OutputVisitor/CSharpOutputVisitor.cs

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

@ -279,6 +279,30 @@ namespace ICSharpCode.Decompiler.CSharp.OutputVisitor
isAfterSpace = false; isAfterSpace = false;
} }
int GetCallChainLengthLimited(MemberReferenceExpression expr)
{
int callChainLength = 0;
var node = expr;
while (node.Target is InvocationExpression invocation && invocation.Target is MemberReferenceExpression mre && callChainLength < 4) {
node = mre;
callChainLength++;
}
return callChainLength;
}
protected virtual void InsertNewLineWhenInMethodCallChain(MemberReferenceExpression expr)
{
int callChainLength = GetCallChainLengthLimited(expr);
if (callChainLength < 3) return;
if (callChainLength == 3)
writer.Indent();
writer.NewLine();
isAtStartOfLine = true;
isAfterSpace = false;
}
protected virtual void OpenBrace(BraceStyle style) protected virtual void OpenBrace(BraceStyle style)
{ {
switch (style) { switch (style) {
@ -810,6 +834,12 @@ namespace ICSharpCode.Decompiler.CSharp.OutputVisitor
invocationExpression.Target.AcceptVisitor(this); invocationExpression.Target.AcceptVisitor(this);
Space(policy.SpaceBeforeMethodCallParentheses); Space(policy.SpaceBeforeMethodCallParentheses);
WriteCommaSeparatedListInParenthesis(invocationExpression.Arguments, policy.SpaceWithinMethodCallParentheses); WriteCommaSeparatedListInParenthesis(invocationExpression.Arguments, policy.SpaceWithinMethodCallParentheses);
if (!(invocationExpression.Parent is MemberReferenceExpression)) {
if (invocationExpression.Target is MemberReferenceExpression mre) {
if (GetCallChainLengthLimited(mre) > 3)
writer.Unindent();
}
}
EndNode(invocationExpression); EndNode(invocationExpression);
} }
@ -859,6 +889,7 @@ namespace ICSharpCode.Decompiler.CSharp.OutputVisitor
{ {
StartNode(memberReferenceExpression); StartNode(memberReferenceExpression);
memberReferenceExpression.Target.AcceptVisitor(this); memberReferenceExpression.Target.AcceptVisitor(this);
InsertNewLineWhenInMethodCallChain(memberReferenceExpression);
WriteToken(Roles.Dot); WriteToken(Roles.Dot);
WriteIdentifier(memberReferenceExpression.MemberNameToken); WriteIdentifier(memberReferenceExpression.MemberNameToken);
WriteTypeArguments(memberReferenceExpression.TypeArguments); WriteTypeArguments(memberReferenceExpression.TypeArguments);

Loading…
Cancel
Save