public static Task <Document> RefactorAsync( Document document, RecordDeclarationSyntax recordDeclaration, IMethodSymbol[] constructorSymbols, SemanticModel semanticModel, CancellationToken cancellationToken = default) { SyntaxList <MemberDeclarationSyntax> members = recordDeclaration.Members; string recordName = recordDeclaration.Identifier.ValueText; bool isSealedClass = recordDeclaration.Modifiers.Contains(SyntaxKind.SealedKeyword); int insertIndex = MemberDeclarationInserter.Default.GetInsertIndex(members, SyntaxKind.ConstructorDeclaration); int position = (insertIndex == 0) ? recordDeclaration.OpenBraceToken.FullSpan.End : members[insertIndex - 1].FullSpan.End; IEnumerable <ConstructorDeclarationSyntax> constructors = constructorSymbols .Select(symbol => CreateConstructor(symbol, recordName, isSealedClass, semanticModel, position)); RecordDeclarationSyntax newRecordDeclaration = recordDeclaration .WithMembers(members.InsertRange(insertIndex, constructors)); return(document.ReplaceNodeAsync(recordDeclaration, newRecordDeclaration, cancellationToken)); }
public static SourceText GeneratePrintMembersText( RecordDeclarationSyntax recordDeclaration, INamedTypeSymbol recordSymbol, Dictionary <SymbolClassification, List <ISymbol> > groups) { MemberDeclarationSyntax printMembersMethod = SyntaxFactory.MethodDeclaration( attributeLists: s_emptyAttributeList, modifiers: GetPrintMembersModifiers(recordSymbol), returnType: SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.BoolKeyword)), explicitInterfaceSpecifier: null, identifier: s_printMembersIdentifier, typeParameterList: null, parameterList: SyntaxFactory.ParameterList( SyntaxFactory.SeparatedList <ParameterSyntax>( new[] { SyntaxFactory.Parameter(s_emptyAttributeList, s_emptyTokenList, s_stringBuilderType, s_builderIdentifier, null) } ) ), constraintClauses: s_emptyConstraintList, body: GenerateBody(recordDeclaration, recordSymbol, groups), expressionBody: null ); string namespaceFullyQualifiedName = GetFullyQualifiedNameOfNamespace(recordSymbol.ContainingNamespace); recordDeclaration = recordDeclaration.WithMembers(new SyntaxList <MemberDeclarationSyntax>(printMembersMethod)); if (namespaceFullyQualifiedName.Length == 0) { return(recordDeclaration.NormalizeWhitespace().GetText(Encoding.UTF8)); } NamespaceDeclarationSyntax namespaceDeclaration = SyntaxFactory.NamespaceDeclaration(SyntaxFactory.IdentifierName(namespaceFullyQualifiedName)); return(namespaceDeclaration.WithMembers(new SyntaxList <MemberDeclarationSyntax>(recordDeclaration)).NormalizeWhitespace().GetText(Encoding.UTF8)); }
/// <summary> /// Creates a new <see cref="RecordDeclarationSyntax"/> with the specified member inserted. /// </summary> /// <param name="recordDeclaration"></param> /// <param name="member"></param> public RecordDeclarationSyntax Insert(RecordDeclarationSyntax recordDeclaration, MemberDeclarationSyntax member) { if (recordDeclaration == null) { throw new ArgumentNullException(nameof(recordDeclaration)); } if (member == null) { throw new ArgumentNullException(nameof(member)); } return(recordDeclaration.WithMembers(Insert(recordDeclaration.Members, member))); }
private RecordDeclarationSyntax SortRecordNode(RecordDeclarationSyntax recordDeclaration) { var membersOfRecord = recordDeclaration.Members.ToList(); var nodeData = membersOfRecord.ToDictionary(x => x, x => new CSharpSyntaxNodeData(x)); IComparer <MemberDeclarationSyntax> comparer = new NodeSorter(nodeData, sortingConfiguration); membersOfRecord.Sort(comparer); RecordDeclarationSyntax recordDeclarationNodeWithoutNodes = recordDeclaration.RemoveNodes(membersOfRecord, SyntaxRemoveOptions.KeepNoTrivia); RecordDeclarationSyntax finalRecordDeclarationNode = recordDeclarationNodeWithoutNodes.WithMembers(new SyntaxList <MemberDeclarationSyntax>(membersOfRecord)); return(finalRecordDeclarationNode); }
public static RecordDeclarationSyntax RemoveMember(RecordDeclarationSyntax recordDeclaration, MemberDeclarationSyntax member) { if (recordDeclaration == null) { throw new ArgumentNullException(nameof(recordDeclaration)); } if (member == null) { throw new ArgumentNullException(nameof(member)); } int index = recordDeclaration.Members.IndexOf(member); MemberDeclarationSyntax newMember = RemoveSingleLineDocumentationComment(member); recordDeclaration = recordDeclaration.WithMembers(recordDeclaration.Members.ReplaceAt(index, newMember)); return(RemoveNode(recordDeclaration, f => f.Members, index, GetRemoveOptions(newMember))); }