public GenericInfo RemoveConstraintClauses() { if (!ConstraintClauses.Any()) { return(this); } TypeParameterConstraintClauseSyntax first = ConstraintClauses.First(); SyntaxToken token = first.WhereKeyword.GetPreviousToken(); SyntaxTriviaList trivia = token.TrailingTrivia.EmptyIfWhitespace() .AddRange(first.GetLeadingTrivia().EmptyIfWhitespace()) .AddRange(ConstraintClauses.Last().GetTrailingTrivia()); return(Create(Declaration.ReplaceToken(token, token.WithTrailingTrivia(trivia))) .WithConstraintClauses(default(SyntaxList <TypeParameterConstraintClauseSyntax>))); }
public static Doc Print(DelegateDeclarationSyntax node) { var docs = new List <Doc> { ExtraNewLines.Print(node), AttributeLists.Print(node, node.AttributeLists), Modifiers.Print(node.Modifiers), Token.PrintWithSuffix(node.DelegateKeyword, " "), Node.Print(node.ReturnType), { " ", Token.Print(node.Identifier) } }; if (node.TypeParameterList != null) { docs.Add(Node.Print(node.TypeParameterList)); } docs.Add( Node.Print(node.ParameterList), ConstraintClauses.Print(node.ConstraintClauses), Token.Print(node.SemicolonToken) ); return(Doc.Concat(docs)); }
public GenericInfo RemoveConstraintClause(TypeParameterConstraintClauseSyntax constraintClause) { switch (Kind) { case SyntaxKind.ClassDeclaration: return(new GenericInfo(((ClassDeclarationSyntax)Declaration).WithConstraintClauses(ConstraintClauses.Remove(constraintClause)))); case SyntaxKind.DelegateDeclaration: return(new GenericInfo(((DelegateDeclarationSyntax)Declaration).WithConstraintClauses(ConstraintClauses.Remove(constraintClause)))); case SyntaxKind.InterfaceDeclaration: return(new GenericInfo(((InterfaceDeclarationSyntax)Declaration).WithConstraintClauses(ConstraintClauses.Remove(constraintClause)))); case SyntaxKind.LocalFunctionStatement: return(new GenericInfo(((LocalFunctionStatementSyntax)Declaration).WithConstraintClauses(ConstraintClauses.Remove(constraintClause)))); case SyntaxKind.MethodDeclaration: return(new GenericInfo(((MethodDeclarationSyntax)Declaration).WithConstraintClauses(ConstraintClauses.Remove(constraintClause)))); case SyntaxKind.StructDeclaration: return(new GenericInfo(((StructDeclarationSyntax)Declaration).WithConstraintClauses(ConstraintClauses.Remove(constraintClause)))); case SyntaxKind.None: return(this); } Debug.Fail(Kind.ToString()); return(this); }
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)); }
protected ConstraintClauseList GetConstraintClauseList() => !Any(ConstraintClauses) ? null : new ConstraintClauseList( ConstraintClauses.Select(clause => new ConstraintClauseListAssociation(new DevOps.Primitives.CSharp.ConstraintClause(clause.Name, new ConstraintList(clause.Constraints.Select(constraint => new ConstraintListAssociation(new Constraint(constraint))).ToList())))).ToList());
/// <summary> /// Creates a new <see cref="GenericInfo"/> with the specified constraint clause removed. /// </summary> /// <param name="constraintClause"></param> /// <returns></returns> public GenericInfo RemoveConstraintClause(TypeParameterConstraintClauseSyntax constraintClause) { ThrowInvalidOperationIfNotInitialized(); switch (Node.Kind()) { case SyntaxKind.ClassDeclaration: return(new GenericInfo(((ClassDeclarationSyntax)Node).WithConstraintClauses(ConstraintClauses.Remove(constraintClause)))); case SyntaxKind.DelegateDeclaration: return(new GenericInfo(((DelegateDeclarationSyntax)Node).WithConstraintClauses(ConstraintClauses.Remove(constraintClause)))); case SyntaxKind.InterfaceDeclaration: return(new GenericInfo(((InterfaceDeclarationSyntax)Node).WithConstraintClauses(ConstraintClauses.Remove(constraintClause)))); case SyntaxKind.LocalFunctionStatement: return(new GenericInfo(((LocalFunctionStatementSyntax)Node).WithConstraintClauses(ConstraintClauses.Remove(constraintClause)))); case SyntaxKind.MethodDeclaration: return(new GenericInfo(((MethodDeclarationSyntax)Node).WithConstraintClauses(ConstraintClauses.Remove(constraintClause)))); case SyntaxKind.StructDeclaration: return(new GenericInfo(((StructDeclarationSyntax)Node).WithConstraintClauses(ConstraintClauses.Remove(constraintClause)))); } Debug.Fail(Node.Kind().ToString()); return(this); }
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)); }