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)); }
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>();
public void Append(TypeParameterListSyntax?typeParameterListSyntax) { if (typeParameterListSyntax is null or { Parameters : { Count : 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)); }
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)); }
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)); }