diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/MemberChains.test b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/MemberChains.test index 86d8d5412..de22b143a 100644 --- a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/MemberChains.test +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/MemberChains.test @@ -245,5 +245,9 @@ class ClassName IEnumerable valueProviderFactories = new ModelBinderAttribute_______().GetValueProviderFactories(config); + + var something________________________________________ = x.SomeProperty + .CallMethod(longParameter_____________, longParameter_____________) + .CallMethod(); } } diff --git a/Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/InvocationExpression.cs b/Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/InvocationExpression.cs index 781b45b7d..b2f443d2c 100644 --- a/Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/InvocationExpression.cs +++ b/Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/InvocationExpression.cs @@ -231,16 +231,14 @@ List printedNodes // will be grouped as // [ // [Identifier, InvocationExpression], - // [MemberAccessExpression] - // [MemberAccessExpression, InvocationExpression], + // [MemberAccessExpression], [MemberAccessExpression, InvocationExpression], // [MemberAccessExpression, InvocationExpression], // [MemberAccessExpression], // ] // so that we can print it as // a() - // .b - // .c() + // .b.c() // .d() // .e @@ -262,16 +260,45 @@ List printedNodes } } - if ( - printedNodes[0].Node is not (InvocationExpressionSyntax or PostfixUnaryExpressionSyntax) - && index < printedNodes.Count - && printedNodes[index].Node - is ElementAccessExpressionSyntax - or PostfixUnaryExpressionSyntax - ) + if (printedNodes[0].Node is not InvocationExpressionSyntax) { - currentGroup.Add(printedNodes[index]); - index++; + for (; index + 1 < printedNodes.Count; ++index) + { + /* this handles the special case where we want ?.Property on the same line + someThing_______________________?.Property + .CallMethod__________________() + .CallMethod__________________(); + */ + if ( + printedNodes[index].Node is ConditionalAccessExpressionSyntax + && printedNodes[index + 1].Node + is MemberBindingExpressionSyntax { Parent: MemberAccessExpressionSyntax } + ) + { + currentGroup.Add(printedNodes[index]); + currentGroup.Add(printedNodes[index + 1]); + index++; + continue; + } + + if ( + ( + IsMemberish(printedNodes[index].Node) + && ( + IsMemberish(printedNodes[index + 1].Node) + || printedNodes[index + 1].Node is PostfixUnaryExpressionSyntax + ) + ) + || printedNodes[index].Node is PostfixUnaryExpressionSyntax + ) + { + currentGroup.Add(printedNodes[index]); + } + else + { + break; + } + } } groups.Add(currentGroup); @@ -314,6 +341,11 @@ or MemberBindingExpressionSyntax return groups; } + private static bool IsMemberish(CSharpSyntaxNode node) + { + return node is MemberAccessExpressionSyntax or ConditionalAccessExpressionSyntax; + } + private static Doc PrintIndentedGroup(ExpressionSyntax node, IList> groups) { if (groups.Count == 0)