Beispiel #1
0
        public static TypeDeclarationSyntax TypeDeclaration(
            SyntaxKind kind,
            SyntaxList <AttributeListSyntax> attributes,
            SyntaxTokenList modifiers,
            SyntaxToken keyword,
            SyntaxToken identifier,
            TypeParameterListSyntax?typeParameterList,
            BaseListSyntax?baseList,
            SyntaxList <TypeParameterConstraintClauseSyntax> constraintClauses,
            SyntaxToken openBraceToken,
            SyntaxList <MemberDeclarationSyntax> members,
            SyntaxToken closeBraceToken,
            SyntaxToken semicolonToken)
        {
            switch (kind)
            {
            case SyntaxKind.ClassDeclaration:
                return(SyntaxFactory.ClassDeclaration(attributes, modifiers, keyword, identifier, typeParameterList, baseList, constraintClauses, openBraceToken, members, closeBraceToken, semicolonToken));

            case SyntaxKind.StructDeclaration:
                return(SyntaxFactory.StructDeclaration(attributes, modifiers, keyword, identifier, typeParameterList, baseList, constraintClauses, openBraceToken, members, closeBraceToken, semicolonToken));

            case SyntaxKind.InterfaceDeclaration:
                return(SyntaxFactory.InterfaceDeclaration(attributes, modifiers, keyword, identifier, typeParameterList, baseList, constraintClauses, openBraceToken, members, closeBraceToken, semicolonToken));

            case SyntaxKind.RecordDeclaration:
                return(SyntaxFactory.RecordDeclaration(attributes, modifiers, keyword, identifier, typeParameterList, parameterList: null, baseList, constraintClauses, openBraceToken, members, closeBraceToken, semicolonToken));

            default:
                throw new ArgumentException("kind");
            }
        }
 public RecordDeclarationSyntax Update(SyntaxList <AttributeListSyntax> attributeLists, SyntaxTokenList modifiers, SyntaxToken keyword, SyntaxToken identifier,
                                       TypeParameterListSyntax?typeParameterList, ParameterListSyntax?parameterList, BaseListSyntax?baseList, SyntaxList <TypeParameterConstraintClauseSyntax> constraintClauses,
                                       SyntaxToken openBraceToken, SyntaxList <MemberDeclarationSyntax> members, SyntaxToken closeBraceToken, SyntaxToken semicolonToken)
 {
     return(Update(attributeLists, modifiers, keyword, this.ClassOrStructKeyword, identifier,
                   typeParameterList, parameterList, baseList, constraintClauses, openBraceToken, members, closeBraceToken, semicolonToken));
 }
Beispiel #3
0
        private static void GetNestedFunctionsParts(
            SyntaxNode nestedFunction,
            out IEnumerable <SyntaxToken> parameters,
            out SyntaxToken asyncKeyword,
            out SyntaxNode body,
            out SyntaxTokenList modifiers,
            out TypeSyntax?returnType,
            out SyntaxToken identifier,
            out TypeParameterListSyntax?typeParameters)
        {
            switch (nestedFunction.Kind())
            {
            case SyntaxKind.SimpleLambdaExpression:
                var simple = (SimpleLambdaExpressionSyntax)nestedFunction;
                parameters     = simple.Parameter.DescendantTokens();
                asyncKeyword   = simple.AsyncKeyword;
                body           = simple.Body;
                modifiers      = default;
                returnType     = default;
                identifier     = default;
                typeParameters = default;
                break;

            case SyntaxKind.ParenthesizedLambdaExpression:
                var parenthesized = (ParenthesizedLambdaExpressionSyntax)nestedFunction;
                parameters     = GetDescendantTokensIgnoringSeparators(parenthesized.ParameterList.Parameters);
                asyncKeyword   = parenthesized.AsyncKeyword;
                body           = parenthesized.Body;
                modifiers      = default;
                returnType     = default;
                identifier     = default;
                typeParameters = default;
                break;

            case SyntaxKind.AnonymousMethodExpression:
                var anonymous = (AnonymousMethodExpressionSyntax)nestedFunction;
                if (anonymous.ParameterList != null)
                {
                    parameters = GetDescendantTokensIgnoringSeparators(anonymous.ParameterList.Parameters);
                }
                else
                {
                    parameters = SpecializedCollections.EmptyEnumerable <SyntaxToken>();
                }

                asyncKeyword   = anonymous.AsyncKeyword;
                body           = anonymous.Block;
                modifiers      = default;
                returnType     = default;
                identifier     = default;
                typeParameters = default;
                break;

            case SyntaxKind.LocalFunctionStatement:
                var localFunction = (LocalFunctionStatementSyntax)nestedFunction;
                parameters     = GetDescendantTokensIgnoringSeparators(localFunction.ParameterList.Parameters);
                asyncKeyword   = default;
                body           = (SyntaxNode?)localFunction.Body ?? localFunction.ExpressionBody !;
                modifiers      = localFunction.Modifiers;
                returnType     = localFunction.ReturnType;
                identifier     = localFunction.Identifier;
                typeParameters = localFunction.TypeParameterList;
                break;

            default:
                throw ExceptionUtilities.UnexpectedValue(nestedFunction.Kind());
            }
        }
 /// <summary>
 /// Extracts the type params using the specified type params
 /// </summary>
 /// <param name="typeParams">The type params</param>
 /// <returns>An enumerable of string</returns>
 public static IEnumerable <string> ExtractTypeParams(TypeParameterListSyntax?typeParams) => typeParams?
 .Parameters
 .Select(p => p.Identifier.Text)
 ?? new List <string>();
Beispiel #5
0
 public void Append(TypeParameterListSyntax?typeParameterListSyntax)
 {
     if (typeParameterListSyntax is null or {
         Parameters : { Count : 0 }
     })
Beispiel #6
0
        public static Doc Print(BaseTypeDeclarationSyntax node)
        {
            ParameterListSyntax?    parameterList     = null;
            TypeParameterListSyntax?typeParameterList = null;
            var         constraintClauses             = Enumerable.Empty <TypeParameterConstraintClauseSyntax>();
            var         hasMembers     = false;
            SyntaxToken?keyword        = null;
            Doc         members        = Doc.Null;
            SyntaxToken?semicolonToken = null;
            string?     groupId        = null;

            if (node is TypeDeclarationSyntax typeDeclarationSyntax)
            {
                typeParameterList = typeDeclarationSyntax.TypeParameterList;
                constraintClauses = typeDeclarationSyntax.ConstraintClauses;
                hasMembers        = typeDeclarationSyntax.Members.Count > 0;
                if (typeDeclarationSyntax.Members.Count > 0)
                {
                    members = Doc.Indent(
                        Doc.HardLine,
                        Doc.Join(Doc.HardLine, typeDeclarationSyntax.Members.Select(Node.Print))
                        );
                }
                if (node is ClassDeclarationSyntax classDeclarationSyntax)
                {
                    keyword = classDeclarationSyntax.Keyword;
                }
                else if (node is StructDeclarationSyntax structDeclarationSyntax)
                {
                    keyword = structDeclarationSyntax.Keyword;
                }
                else if (node is InterfaceDeclarationSyntax interfaceDeclarationSyntax)
                {
                    keyword = interfaceDeclarationSyntax.Keyword;
                }
                else if (node is RecordDeclarationSyntax recordDeclarationSyntax)
                {
                    keyword       = recordDeclarationSyntax.Keyword;
                    groupId       = Guid.NewGuid().ToString();
                    parameterList = recordDeclarationSyntax.ParameterList;
                }

                semicolonToken = typeDeclarationSyntax.SemicolonToken;
            }
            else if (node is EnumDeclarationSyntax enumDeclarationSyntax)
            {
                members = Doc.Indent(
                    Doc.HardLine,
                    SeparatedSyntaxList.Print(
                        enumDeclarationSyntax.Members,
                        EnumMemberDeclaration.Print,
                        Doc.HardLine
                        )
                    );
                hasMembers     = enumDeclarationSyntax.Members.Count > 0;
                keyword        = enumDeclarationSyntax.EnumKeyword;
                semicolonToken = enumDeclarationSyntax.SemicolonToken;
            }

            var docs = new List <Doc>
            {
                ExtraNewLines.Print(node),
                AttributeLists.Print(node, node.AttributeLists),
                Modifiers.Print(node.Modifiers)
            };

            if (keyword != null)
            {
                docs.Add(Token.PrintWithSuffix(keyword.Value, " "));
            }

            docs.Add(Token.Print(node.Identifier));

            if (typeParameterList != null)
            {
                docs.Add(TypeParameterList.Print(typeParameterList));
            }

            if (parameterList != null)
            {
                docs.Add(ParameterList.Print(parameterList, groupId));
            }

            if (node.BaseList != null)
            {
                docs.Add(BaseList.Print(node.BaseList));
            }

            docs.Add(ConstraintClauses.Print(constraintClauses));

            if (hasMembers)
            {
                DocUtilities.RemoveInitialDoubleHardLine(members);

                var useSpaceBraceWithParameterList = groupId != null && parameterList != null;
                docs.Add(
                    useSpaceBraceWithParameterList
                        ? Doc.IfBreak(" ", Doc.Line, groupId)
                        : Doc.HardLine,
                    Token.Print(node.OpenBraceToken),
                    members,
                    Doc.HardLine,
                    Token.Print(node.CloseBraceToken)
                    );
            }
            else if (node.OpenBraceToken.Kind() != SyntaxKind.None)
            {
                Doc separator = node.CloseBraceToken.LeadingTrivia.Any() ? Doc.Line : " ";

                docs.Add(
                    separator,
                    Token.Print(node.OpenBraceToken),
                    separator,
                    Token.Print(node.CloseBraceToken)
                    );
            }

            if (semicolonToken.HasValue)
            {
                docs.Add(Token.Print(semicolonToken.Value));
            }

            return(Doc.Concat(docs));
        }
Beispiel #7
0
        private Doc PrintBaseMethodDeclarationSyntax(CSharpSyntaxNode node)
        {
            SyntaxList <AttributeListSyntax>?attributeLists = null;
            SyntaxTokenList?modifiers  = null;
            TypeSyntax?     returnType = null;
            ExplicitInterfaceSpecifierSyntax?explicitInterfaceSpecifier = null;
            TypeParameterListSyntax?         typeParameterList          = null;
            Doc identifier        = Doc.Null;
            var constraintClauses = Enumerable.Empty <TypeParameterConstraintClauseSyntax>();
            ParameterListSyntax?        parameterList  = null;
            BlockSyntax?                body           = null;
            ArrowExpressionClauseSyntax?expressionBody = null;
            SyntaxToken?                semicolonToken = null;

            if (node is BaseMethodDeclarationSyntax baseMethodDeclarationSyntax)
            {
                attributeLists = baseMethodDeclarationSyntax.AttributeLists;
                modifiers      = baseMethodDeclarationSyntax.Modifiers;
                parameterList  = baseMethodDeclarationSyntax.ParameterList;
                body           = baseMethodDeclarationSyntax.Body;
                expressionBody = baseMethodDeclarationSyntax.ExpressionBody;
                if (node is MethodDeclarationSyntax methodDeclarationSyntax)
                {
                    returnType = methodDeclarationSyntax.ReturnType;
                    explicitInterfaceSpecifier = methodDeclarationSyntax.ExplicitInterfaceSpecifier;
                    identifier = this.PrintSyntaxToken(
                        methodDeclarationSyntax.Identifier
                        );
                    typeParameterList = methodDeclarationSyntax.TypeParameterList;
                    constraintClauses = methodDeclarationSyntax.ConstraintClauses;
                }

                semicolonToken = baseMethodDeclarationSyntax.SemicolonToken;
            }
            else if (
                node is LocalFunctionStatementSyntax localFunctionStatementSyntax
                )
            {
                attributeLists = localFunctionStatementSyntax.AttributeLists;
                modifiers      = localFunctionStatementSyntax.Modifiers;
                returnType     = localFunctionStatementSyntax.ReturnType;
                identifier     = this.PrintSyntaxToken(
                    localFunctionStatementSyntax.Identifier
                    );
                typeParameterList = localFunctionStatementSyntax.TypeParameterList;
                parameterList     = localFunctionStatementSyntax.ParameterList;
                constraintClauses = localFunctionStatementSyntax.ConstraintClauses;
                body           = localFunctionStatementSyntax.Body;
                expressionBody = localFunctionStatementSyntax.ExpressionBody;
                semicolonToken = localFunctionStatementSyntax.SemicolonToken;
            }

            var parts = new Parts();

            parts.Push(this.PrintExtraNewLines(node));

            if (attributeLists.HasValue)
            {
                parts.Push(
                    this.PrintAttributeLists(node, attributeLists.Value)
                    );
            }
            if (modifiers.HasValue)
            {
                parts.Push(this.PrintModifiers(modifiers.Value));
            }

            if (returnType != null)
            {
                // TODO 1 preprocessor stuff is going to be painful, because it doesn't parse some of it. Could we figure that out somehow? that may get complicated
                parts.Push(this.Print(returnType));
                parts.Push(SpaceIfNoPreviousComment);
            }

            if (explicitInterfaceSpecifier != null)
            {
                parts.Push(
                    this.Print(explicitInterfaceSpecifier.Name),
                    this.PrintSyntaxToken(explicitInterfaceSpecifier.DotToken)
                    );
            }

            if (identifier != null)
            {
                parts.Push(identifier);
            }

            if (
                node is ConversionOperatorDeclarationSyntax conversionOperatorDeclarationSyntax
                )
            {
                parts.Push(
                    this.PrintSyntaxToken(
                        conversionOperatorDeclarationSyntax.ImplicitOrExplicitKeyword,
                        " "
                        ),
                    this.PrintSyntaxToken(
                        conversionOperatorDeclarationSyntax.OperatorKeyword,
                        " "
                        ),
                    this.Print(conversionOperatorDeclarationSyntax.Type)
                    );
            }
            else if (
                node is OperatorDeclarationSyntax operatorDeclarationSyntax
                )
            {
                parts.Push(
                    this.Print(operatorDeclarationSyntax.ReturnType),
                    SpaceIfNoPreviousComment,
                    this.PrintSyntaxToken(
                        operatorDeclarationSyntax.OperatorKeyword,
                        " "
                        ),
                    this.PrintSyntaxToken(
                        operatorDeclarationSyntax.OperatorToken
                        )
                    );
            }

            if (typeParameterList != null)
            {
                parts.Push(
                    this.PrintTypeParameterListSyntax(typeParameterList)
                    );
            }

            if (parameterList != null)
            {
                parts.Push(this.PrintParameterListSyntax(parameterList));
            }

            parts.Push(this.PrintConstraintClauses(node, constraintClauses));
            if (body != null)
            {
                parts.Push(this.PrintBlockSyntax(body));
            }
            else
            {
                if (expressionBody != null)
                {
                    parts.Push(
                        this.PrintArrowExpressionClauseSyntax(expressionBody)
                        );
                }
            }

            if (semicolonToken.HasValue)
            {
                parts.Push(this.PrintSyntaxToken(semicolonToken.Value));
            }

            return(Concat(parts));
        }
 // Preserved as shipped public API for binary compatibility
 public static LocalFunctionStatementSyntax LocalFunctionStatement(SyntaxTokenList modifiers, TypeSyntax returnType, SyntaxToken identifier, TypeParameterListSyntax?typeParameterList, ParameterListSyntax parameterList, SyntaxList <TypeParameterConstraintClauseSyntax> constraintClauses, BlockSyntax?body, ArrowExpressionClauseSyntax?expressionBody)
 {
     return(LocalFunctionStatement(attributeLists: default, modifiers, returnType, identifier, typeParameterList, parameterList, constraintClauses, body, expressionBody, semicolonToken: default));
 public static RecordDeclarationSyntax RecordDeclaration(SyntaxList <AttributeListSyntax> attributeLists, SyntaxTokenList modifiers, SyntaxToken keyword, SyntaxToken identifier,
                                                         TypeParameterListSyntax?typeParameterList, ParameterListSyntax?parameterList, BaseListSyntax?baseList, SyntaxList <TypeParameterConstraintClauseSyntax> constraintClauses,
                                                         SyntaxToken openBraceToken, SyntaxList <MemberDeclarationSyntax> members, SyntaxToken closeBraceToken, SyntaxToken semicolonToken)
 {
     return(RecordDeclaration(SyntaxKind.RecordDeclaration, attributeLists, modifiers, keyword, classOrStructKeyword: default, identifier,
        public static Doc Print(CSharpSyntaxNode node)
        {
            SyntaxList <AttributeListSyntax>?attributeLists = null;
            SyntaxTokenList?modifiers  = null;
            TypeSyntax?     returnType = null;
            ExplicitInterfaceSpecifierSyntax?explicitInterfaceSpecifier = null;
            TypeParameterListSyntax?         typeParameterList          = null;
            Doc identifier        = Doc.Null;
            var constraintClauses = Enumerable.Empty <TypeParameterConstraintClauseSyntax>();
            ParameterListSyntax?         parameterList          = null;
            ConstructorInitializerSyntax?constructorInitializer = null;
            BlockSyntax?body = null;
            ArrowExpressionClauseSyntax?expressionBody = null;
            SyntaxToken?semicolonToken = null;
            string?     groupId        = null;

            if (node is BaseMethodDeclarationSyntax baseMethodDeclarationSyntax)
            {
                attributeLists = baseMethodDeclarationSyntax.AttributeLists;
                modifiers      = baseMethodDeclarationSyntax.Modifiers;
                parameterList  = baseMethodDeclarationSyntax.ParameterList;
                body           = baseMethodDeclarationSyntax.Body;
                expressionBody = baseMethodDeclarationSyntax.ExpressionBody;
                if (node is MethodDeclarationSyntax methodDeclarationSyntax)
                {
                    returnType = methodDeclarationSyntax.ReturnType;
                    explicitInterfaceSpecifier = methodDeclarationSyntax.ExplicitInterfaceSpecifier;
                    identifier        = Token.Print(methodDeclarationSyntax.Identifier);
                    typeParameterList = methodDeclarationSyntax.TypeParameterList;
                    constraintClauses = methodDeclarationSyntax.ConstraintClauses;
                }
                else if (node is DestructorDeclarationSyntax destructorDeclarationSyntax)
                {
                    identifier = Doc.Concat(
                        Token.Print(destructorDeclarationSyntax.TildeToken),
                        Token.Print(destructorDeclarationSyntax.Identifier)
                        );
                }
                else if (node is ConstructorDeclarationSyntax constructorDeclarationSyntax)
                {
                    identifier             = Token.Print(constructorDeclarationSyntax.Identifier);
                    constructorInitializer = constructorDeclarationSyntax.Initializer;
                }

                semicolonToken = baseMethodDeclarationSyntax.SemicolonToken;
            }
            else if (node is LocalFunctionStatementSyntax localFunctionStatementSyntax)
            {
                attributeLists    = localFunctionStatementSyntax.AttributeLists;
                modifiers         = localFunctionStatementSyntax.Modifiers;
                returnType        = localFunctionStatementSyntax.ReturnType;
                identifier        = Token.Print(localFunctionStatementSyntax.Identifier);
                typeParameterList = localFunctionStatementSyntax.TypeParameterList;
                parameterList     = localFunctionStatementSyntax.ParameterList;
                constraintClauses = localFunctionStatementSyntax.ConstraintClauses;
                body           = localFunctionStatementSyntax.Body;
                expressionBody = localFunctionStatementSyntax.ExpressionBody;
                semicolonToken = localFunctionStatementSyntax.SemicolonToken;
            }

            var docs = new List <Doc> {
                ExtraNewLines.Print(node)
            };

            if (attributeLists.HasValue)
            {
                docs.Add(AttributeLists.Print(node, attributeLists.Value));
            }

            var declarationGroup = new List <Doc>();

            if (modifiers.HasValue)
            {
                declarationGroup.Add(Modifiers.PrintWithoutLeadingTrivia(modifiers.Value));
            }

            if (returnType != null)
            {
                if (!(modifiers.HasValue && modifiers.Value.Count > 0))
                {
                    Token.ShouldSkipNextLeadingTrivia = true;
                }

                declarationGroup.Add(Node.Print(returnType), " ");
                Token.ShouldSkipNextLeadingTrivia = false;
            }

            if (explicitInterfaceSpecifier != null)
            {
                declarationGroup.Add(
                    Node.Print(explicitInterfaceSpecifier.Name),
                    Token.Print(explicitInterfaceSpecifier.DotToken)
                    );
            }

            if (identifier != Doc.Null)
            {
                declarationGroup.Add(identifier);
            }

            if (node is ConversionOperatorDeclarationSyntax conversionOperatorDeclarationSyntax)
            {
                declarationGroup.Add(
                    Token.PrintWithSuffix(
                        conversionOperatorDeclarationSyntax.ImplicitOrExplicitKeyword,
                        " "
                        ),
                    Token.Print(conversionOperatorDeclarationSyntax.OperatorKeyword, " "),
                    Node.Print(conversionOperatorDeclarationSyntax.Type)
                    );
            }
            else if (node is OperatorDeclarationSyntax operatorDeclarationSyntax)
            {
                declarationGroup.Add(
                    Node.Print(operatorDeclarationSyntax.ReturnType),
                    " ",
                    Token.Print(operatorDeclarationSyntax.OperatorKeyword, " "),
                    Token.Print(operatorDeclarationSyntax.OperatorToken)
                    );
            }

            if (typeParameterList != null)
            {
                declarationGroup.Add(TypeParameterList.Print(typeParameterList));
            }

            if (parameterList != null)
            {
                // if there are no parameters, but there is a super long method name, a groupId
                // will cause SpaceBrace when it isn't wanted.
                if (parameterList.Parameters.Count > 0)
                {
                    groupId = Guid.NewGuid().ToString();
                }
                declarationGroup.Add(ParameterList.Print(parameterList, groupId));
                declarationGroup.Add(Doc.IfBreak(Doc.Null, Doc.SoftLine));
            }

            if (constructorInitializer != null)
            {
                declarationGroup.Add(ConstructorInitializer.Print(constructorInitializer));
            }

            if (modifiers.HasValue && modifiers.Value.Count > 0)
            {
                docs.Add(Token.PrintLeadingTrivia(modifiers.Value[0]));
            }
            else if (returnType != null)
            {
                docs.Add(Token.PrintLeadingTrivia(returnType.GetLeadingTrivia()));
            }

            docs.Add(Doc.Group(declarationGroup));

            docs.Add(ConstraintClauses.Print(constraintClauses));
            if (body != null)
            {
                docs.Add(
                    groupId != null
                        ? Block.PrintWithConditionalSpace(body, groupId)
                        : Block.Print(body)
                    );
            }
            else
            {
                if (expressionBody != null)
                {
                    docs.Add(ArrowExpressionClause.Print(expressionBody));
                }
            }

            if (semicolonToken.HasValue)
            {
                docs.Add(Token.Print(semicolonToken.Value));
            }

            return(Doc.Group(docs));
        }
Beispiel #11
0
        private Doc PrintBaseTypeDeclarationSyntax(
            BaseTypeDeclarationSyntax node)
        {
            ParameterListSyntax?    parameterList     = null;
            TypeParameterListSyntax?typeParameterList = null;
            var         constraintClauses             = Enumerable.Empty <TypeParameterConstraintClauseSyntax>();
            var         hasMembers     = false;
            SyntaxToken?keyword        = null;
            Doc         members        = Doc.Null;
            SyntaxToken?semicolonToken = null;

            if (node is TypeDeclarationSyntax typeDeclarationSyntax)
            {
                typeParameterList = typeDeclarationSyntax.TypeParameterList;
                constraintClauses = typeDeclarationSyntax.ConstraintClauses;
                hasMembers        = typeDeclarationSyntax.Members.Count > 0;
                if (typeDeclarationSyntax.Members.Count > 0)
                {
                    members = Indent(
                        HardLine,
                        Join(
                            HardLine,
                            typeDeclarationSyntax.Members.Select(this.Print)
                            )
                        );
                }
                if (node is ClassDeclarationSyntax classDeclarationSyntax)
                {
                    keyword = classDeclarationSyntax.Keyword;
                }
                else if (
                    node is StructDeclarationSyntax structDeclarationSyntax
                    )
                {
                    keyword = structDeclarationSyntax.Keyword;
                }
                else if (
                    node is InterfaceDeclarationSyntax interfaceDeclarationSyntax
                    )
                {
                    keyword = interfaceDeclarationSyntax.Keyword;
                }
                else if (
                    node is RecordDeclarationSyntax recordDeclarationSyntax
                    )
                {
                    keyword       = recordDeclarationSyntax.Keyword;
                    parameterList = recordDeclarationSyntax.ParameterList;
                }

                semicolonToken = typeDeclarationSyntax.SemicolonToken;
            }
            else if (node is EnumDeclarationSyntax enumDeclarationSyntax)
            {
                members = Indent(
                    HardLine,
                    this.PrintSeparatedSyntaxList(
                        enumDeclarationSyntax.Members,
                        this.PrintEnumMemberDeclarationSyntax,
                        HardLine
                        )
                    );
                hasMembers     = enumDeclarationSyntax.Members.Count > 0;
                keyword        = enumDeclarationSyntax.EnumKeyword;
                semicolonToken = enumDeclarationSyntax.SemicolonToken;
            }

            var parts = new Parts();

            parts.Push(this.PrintExtraNewLines(node));
            parts.Push(this.PrintAttributeLists(node, node.AttributeLists));
            parts.Push(this.PrintModifiers(node.Modifiers));
            if (keyword != null)
            {
                parts.Push(this.PrintSyntaxToken(keyword.Value, " "));
            }

            parts.Push(this.PrintSyntaxToken(node.Identifier));

            if (parameterList != null)
            {
                parts.Push(this.PrintParameterListSyntax(parameterList));
            }

            if (typeParameterList != null)
            {
                parts.Push(
                    this.PrintTypeParameterListSyntax(typeParameterList)
                    );
            }

            if (node.BaseList != null)
            {
                parts.Push(this.PrintBaseListSyntax(node.BaseList));
            }

            parts.Push(this.PrintConstraintClauses(node, constraintClauses));

            if (hasMembers)
            {
                parts.Push(
                    HardLine,
                    this.PrintSyntaxToken(node.OpenBraceToken),
                    members,
                    HardLine,
                    this.PrintSyntaxToken(node.CloseBraceToken)
                    );
            }
            else if (node.OpenBraceToken.Kind() != SyntaxKind.None)
            {
                parts.Push(
                    " ",
                    this.PrintSyntaxToken(node.OpenBraceToken),
                    " ",
                    this.PrintSyntaxToken(node.CloseBraceToken)
                    );
            }

            if (semicolonToken.HasValue)
            {
                parts.Push(this.PrintSyntaxToken(semicolonToken.Value));
            }

            return(Concat(parts));
        }