diff --git a/Src/CSharpier.Tests/TestFiles/ConstructorDeclaration/ConstructorDeclarations.cst b/Src/CSharpier.Tests/TestFiles/ConstructorDeclaration/ConstructorDeclarations.cst index 43b884916..9be39a90e 100644 --- a/Src/CSharpier.Tests/TestFiles/ConstructorDeclaration/ConstructorDeclarations.cst +++ b/Src/CSharpier.Tests/TestFiles/ConstructorDeclaration/ConstructorDeclarations.cst @@ -27,21 +27,49 @@ public class Initializers : BasicClass public Initializers(string value) : base(value) { } public Initializers( - string reallyLooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongParameter + string longParameter_______________________________________________________________________________ ) : base( - reallyLooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongParameterIMeanIt + longParameter_______________________________________________________________________________ ) { } public Initializers( - string reallyLooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongParameter + string longParameter_______________________________________________________________________________ + ) : base( + longParameter_______________________________________________________________________________ + ) { + WithBody(); + } + + public Initializers( + string longParameter____________________________________________________________ ) : base(false) { } - public ReallyLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooogMethodName() + public Initializers( + string longParameter____________________________________________________________ + ) : base(false) + { + WithBody(); + } + + public LongMethodName___________________________________________________________________________() : base(false) { } - public ReallyLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooogMethodName() + public WithParameters(string parameter) + : base( + longParameter____________________________________________________________________________ + ) { } + + // this may change, see #372 + public WithParameters(string parameter) + : base( + longParameter____________________________________________________________________________ + ) { + WithBody(); + } + + public LongMethodName___________________________________________________________________________() : base( - reallyLooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongParameterIMeanIt + longParameter____________________________________________________________________________ ) { } public Initializers( @@ -49,19 +77,44 @@ public class Initializers : BasicClass ) /*Comment*/ : base(value) { } - public ReallyLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooogMethodName() + public LongMethodName___________________________________________________________() /*Comment*/: base(false) { } + + public LongInitializerBreaksAtEdgeCase() + : this(someParameter, someOtherParameter___________________________________________________) + { + WithBody(); + } + + public LongParametersWithEmptyBody(string parameter, bool anotherParameter_________________) { } + + public LongParametersWithEmptyBody(string parameter, bool anotherParameter__________________) + { } + + public LongInitializerWithEmptyBody() : base(parameter, anotherParameter___________________) { } + + public LongInitializerWithEmptyBody() : base(parameter, anotherParameter__________________) { } + + public LongInitializerWithEmptyBody() + : base(parameter______________, anotherParameter___________________________________________) + { } } -public class Exactly80 +public class Exactly100 { - public Exactly80(int lajsfaskdlfklasdfklskadlfklsdfkasdkfjaskdfkdfdddd) + public Exactly100() + : this(someParameter, someOtherParameter___________________________________________________) + { + WithBody(); + } + + public Exactly100(int longParameter____________________________________________________________) { return; } // leading comments don't affect this - public Exactly80(string lajsfaskdlfklasdfklskadlfklsdfkasdkfjaskdfkdfd) + public Exactly100(int longParameter____________________________________________________________) { return; } diff --git a/Src/CSharpier/SyntaxPrinter/Node.cs b/Src/CSharpier/SyntaxPrinter/Node.cs index 3464ecf4b..1dac69722 100644 --- a/Src/CSharpier/SyntaxPrinter/Node.cs +++ b/Src/CSharpier/SyntaxPrinter/Node.cs @@ -109,8 +109,6 @@ public static Doc Print(SyntaxNode syntaxNode) return ConstantPattern.Print(constantPatternSyntax); case ConstructorConstraintSyntax constructorConstraintSyntax: return ConstructorConstraint.Print(constructorConstraintSyntax); - case ConstructorInitializerSyntax constructorInitializerSyntax: - return ConstructorInitializer.Print(constructorInitializerSyntax); case ContinueStatementSyntax continueStatementSyntax: return ContinueStatement.Print(continueStatementSyntax); case DeclarationExpressionSyntax declarationExpressionSyntax: diff --git a/Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/BaseMethodDeclaration.cs b/Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/BaseMethodDeclaration.cs index 2d1b30095..1e78f326c 100644 --- a/Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/BaseMethodDeclaration.cs +++ b/Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/BaseMethodDeclaration.cs @@ -25,7 +25,8 @@ public static Doc Print(CSharpSyntaxNode node) BlockSyntax? body = null; ArrowExpressionClauseSyntax? expressionBody = null; SyntaxToken? semicolonToken = null; - string? groupId = null; + string? parameterGroupId = null; + string? constructorInitializerGroupId = null; if (node is BaseMethodDeclarationSyntax baseMethodDeclarationSyntax) { @@ -141,22 +142,47 @@ public static Doc Print(CSharpSyntaxNode node) // will cause SpaceBrace when it isn't wanted. if (parameterList.Parameters.Count > 0) { - groupId = Guid.NewGuid().ToString(); + parameterGroupId = Guid.NewGuid().ToString(); } - declarationGroup.Add(ParameterList.Print(parameterList, groupId)); + declarationGroup.Add(ParameterList.Print(parameterList, parameterGroupId)); declarationGroup.Add(Doc.IfBreak(Doc.Null, Doc.SoftLine)); } if (constructorInitializer != null) { - declarationGroup.Add( - groupId != null - ? ConstructorInitializer.PrintWithConditionalSpace( - constructorInitializer, - groupId - ) - : ConstructorInitializer.Print(constructorInitializer) + constructorInitializerGroupId = Guid.NewGuid().ToString(); + var colonToken = Token.PrintWithSuffix(constructorInitializer.ColonToken, " "); + var argumentList = Doc.GroupWithId( + constructorInitializerGroupId, + ArgumentList.Print(constructorInitializer.ArgumentList) ); + + if (parameterGroupId != null) + { + declarationGroup.Add( + Doc.Group( + Doc.Indent(Doc.IfBreak(" ", Doc.Line, parameterGroupId)), + Doc.IfBreak( + Doc.Align(2, colonToken), + Doc.Indent(colonToken), + parameterGroupId + ), + Token.Print(constructorInitializer.ThisOrBaseKeyword), + Doc.IfBreak(argumentList, Doc.Indent(argumentList), parameterGroupId) + ) + ); + } + else + { + declarationGroup.Add( + Doc.Group( + Doc.Indent(Doc.Line), + Doc.Indent(colonToken), + Token.Print(constructorInitializer.ThisOrBaseKeyword), + Doc.Indent(argumentList) + ) + ); + } } if (modifiers is { Count: > 0 }) @@ -173,18 +199,31 @@ public static Doc Print(CSharpSyntaxNode node) if (constraintClauses != null) { docs.Add( - groupId != null - ? ConstraintClauses.PrintWithConditionalSpace(constraintClauses, groupId) + parameterGroupId != null + ? ConstraintClauses.PrintWithConditionalSpace( + constraintClauses, + parameterGroupId + ) : ConstraintClauses.Print(constraintClauses) ); } if (body != null) { - docs.Add( - groupId != null + string? conditionalSpaceGroupId = null; + if (constructorInitializerGroupId != null) + { + conditionalSpaceGroupId = constructorInitializerGroupId; + } + else if ( + parameterGroupId != null && (constraintClauses == null || constraintClauses.Value.Count == 0) - ? Block.PrintWithConditionalSpace(body, groupId) + ) { + conditionalSpaceGroupId = parameterGroupId; + } + docs.Add( + conditionalSpaceGroupId != null + ? Block.PrintWithConditionalSpace(body, conditionalSpaceGroupId) : Block.Print(body) ); } diff --git a/Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/ConstructorInitializer.cs b/Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/ConstructorInitializer.cs deleted file mode 100644 index 641bc3d69..000000000 --- a/Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/ConstructorInitializer.cs +++ /dev/null @@ -1,35 +0,0 @@ -using CSharpier.DocTypes; -using Microsoft.CodeAnalysis.CSharp.Syntax; - -namespace CSharpier.SyntaxPrinter.SyntaxNodePrinters -{ - public static class ConstructorInitializer - { - public static Doc PrintWithConditionalSpace( - ConstructorInitializerSyntax node, - string groupId - ) { - return Print(node, groupId); - } - - public static Doc Print(ConstructorInitializerSyntax node) - { - return Print(node, null); - } - - private static Doc Print(ConstructorInitializerSyntax node, string? groupId) - { - var colonToken = Token.PrintWithSuffix(node.ColonToken, " "); - return Doc.Group( - Doc.Indent(groupId != null ? Doc.IfBreak(" ", Doc.Line, groupId) : Doc.Line), - groupId != null - ? Doc.IfBreak(Doc.Align(2, colonToken), Doc.Indent(colonToken), groupId) - : Doc.Indent(colonToken), - Token.Print(node.ThisOrBaseKeyword), - groupId != null - ? ArgumentList.Print(node.ArgumentList) - : Doc.Indent(ArgumentList.Print(node.ArgumentList)) - ); - } - } -}