From d4698d837fc88ce711e75b7f0bb4560db182f115 Mon Sep 17 00:00:00 2001 From: Bela VanderVoort Date: Sun, 24 Oct 2021 10:37:50 -0500 Subject: [PATCH] Always break and indent nested conditionals closes #434 --- Src/CSharpier.Tests/DocSerializerTests.cs | 2 ++ .../TestFiles/ConditionalExpressions.cst | 24 +++++++++++++++++ Src/CSharpier/DocSerializer.cs | 5 ++++ .../ConditionalExpression.cs | 26 ++++++++++++------- 4 files changed, 47 insertions(+), 10 deletions(-) diff --git a/Src/CSharpier.Tests/DocSerializerTests.cs b/Src/CSharpier.Tests/DocSerializerTests.cs index 82e119851..a73862f57 100644 --- a/Src/CSharpier.Tests/DocSerializerTests.cs +++ b/Src/CSharpier.Tests/DocSerializerTests.cs @@ -30,6 +30,7 @@ public void Should_Format_Basic_Types() Doc.SoftLine, Doc.Null, Doc.Trim, + Doc.BreakParent, "1" ); @@ -48,6 +49,7 @@ public void Should_Format_Basic_Types() Doc.SoftLine, Doc.Null, Doc.Trim, + Doc.BreakParent, ""1"" )" ); diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/ConditionalExpressions.cst b/Src/CSharpier.Tests/FormattingTests/TestFiles/ConditionalExpressions.cst index 2caf0a2df..888a86303 100644 --- a/Src/CSharpier.Tests/FormattingTests/TestFiles/ConditionalExpressions.cst +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/ConditionalExpressions.cst @@ -99,5 +99,29 @@ public class ClassName ) ? trueValue________________________________ : falseValue_______________________________; + + return firstCondition + ? firstValue + : secondCondition + ? secondValue + : thirdCondition + ? thirdValue + : fourthValue; + + return firstCondition + ? secondCondition + ? firstValue + : secondValue + : thirdCondition + ? thirdValue + : fourthValue; + + return a ? b : c; + + return a + ? b + : c + ? d + : e; } } diff --git a/Src/CSharpier/DocSerializer.cs b/Src/CSharpier/DocSerializer.cs index 870033a65..5d5a6315d 100644 --- a/Src/CSharpier/DocSerializer.cs +++ b/Src/CSharpier/DocSerializer.cs @@ -70,6 +70,11 @@ void AppendNextIndent() AppendIndent(); result.Append("Doc.LiteralLine"); } + else if (doc is BreakParent) + { + AppendIndent(); + result.Append("Doc.BreakParent"); + } else if (doc is LineDoc lineDoc) { AppendIndent(); diff --git a/Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/ConditionalExpression.cs b/Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/ConditionalExpression.cs index ebac02720..10e99b2d7 100644 --- a/Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/ConditionalExpression.cs +++ b/Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/ConditionalExpression.cs @@ -8,7 +8,7 @@ public static class ConditionalExpression { public static Doc Print(ConditionalExpressionSyntax node) { - Doc[] contents = + Doc[] innerContents = { Doc.Line, Token.PrintWithSuffix(node.QuestionToken, " "), @@ -18,20 +18,26 @@ public static Doc Print(ConditionalExpressionSyntax node) Doc.Align(2, Node.Print(node.WhenFalse)) }; - return Doc.Group( + Doc[] outerContents = + { + node.Parent is ConditionalExpressionSyntax ? Doc.BreakParent : Doc.Null, node.Parent is ReturnStatementSyntax - && node.Condition is BinaryExpressionSyntax or IsPatternExpressionSyntax - ? Doc.Indent( - Doc.Group(Doc.IfBreak(Doc.SoftLine, Doc.Null), Node.Print(node.Condition)) - ) - : Node.Print(node.Condition), + && node.Condition is BinaryExpressionSyntax or IsPatternExpressionSyntax + ? Doc.Indent( + Doc.Group(Doc.IfBreak(Doc.SoftLine, Doc.Null), Node.Print(node.Condition)) + ) + : Node.Print(node.Condition), node.Parent is ConditionalExpressionSyntax or ArgumentSyntax or ReturnStatementSyntax - ? Doc.Align(2, contents) - : Doc.Indent(contents) - ); + ? Doc.Align(2, innerContents) + : Doc.Indent(innerContents) + }; + + return node.Parent is ConditionalExpressionSyntax + ? Doc.Concat(outerContents) + : Doc.Group(outerContents); } } }