public static async Task <Document> RefactorAsync( Document document, MemberDeclarationSyntax member, CancellationToken cancellationToken = default) { MemberDeclarationSyntax newMember = member; SyntaxToken identifier = GetIdentifier(member); if (identifier != default) { SemanticModel semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); string newName = NameGenerator.Default.EnsureUniqueName(identifier.ValueText, semanticModel, member.SpanStart); ISymbol symbol = semanticModel.GetDeclaredSymbol(member, cancellationToken); ImmutableArray <SyntaxNode> references = await SyntaxFinder.FindReferencesAsync(symbol, document.Solution(), documents : ImmutableHashSet.Create(document), cancellationToken : cancellationToken).ConfigureAwait(false); SyntaxToken newIdentifier = SyntaxFactory.Identifier(newName); newMember = member.ReplaceNodes( references.Where(n => member.Contains(n)), (n, _) => { if (n is IdentifierNameSyntax identifierName) { return(identifierName.WithIdentifier(newIdentifier.WithTriviaFrom(identifierName.Identifier))); } else { Debug.Fail(n.Kind().ToString()); return(n); } }); newMember = SetIdentifier(newMember, newIdentifier.WithRenameAnnotation()); } else { newMember = newMember.WithNavigationAnnotation(); } MemberDeclarationListInfo memberList = SyntaxInfo.MemberDeclarationListInfo(member.Parent); int index = memberList.IndexOf(member); if (index == 0) { SyntaxToken?openBrace = memberList.OpenBraceToken; if (openBrace != null && openBrace.Value.GetFullSpanEndLine() == member.GetFullSpanStartLine()) { newMember = newMember.WithLeadingTrivia(member.GetLeadingTrivia().Insert(0, NewLine())); } } return(await document.ReplaceMembersAsync(memberList, memberList.Members.Insert(index + 1, newMember), cancellationToken).ConfigureAwait(false)); }
private static SyntaxNode Refactor(MemberDeclarationSyntax member) { switch (member.Parent.Kind()) { case SyntaxKind.CompilationUnit: { var parent = (CompilationUnitSyntax)member.Parent; SyntaxList <MemberDeclarationSyntax> members = parent.Members; int index = members.IndexOf(member); return(parent.WithMembers(members.Insert(index + 1, member))); } case SyntaxKind.NamespaceDeclaration: { var parent = (NamespaceDeclarationSyntax)member.Parent; SyntaxList <MemberDeclarationSyntax> members = parent.Members; int index = members.IndexOf(member); if (index == 0 && parent.OpenBraceToken.GetFullSpanEndLine() == member.GetFullSpanStartLine()) { member = member.WithLeadingTrivia(member.GetLeadingTrivia().Insert(0, NewLineTrivia())); } return(parent.WithMembers(members.Insert(index + 1, member))); } case SyntaxKind.ClassDeclaration: { var parent = (ClassDeclarationSyntax)member.Parent; SyntaxList <MemberDeclarationSyntax> members = parent.Members; int index = members.IndexOf(member); if (index == 0 && parent.OpenBraceToken.GetFullSpanEndLine() == member.GetFullSpanStartLine()) { member = member.WithLeadingTrivia(member.GetLeadingTrivia().Insert(0, NewLineTrivia())); } return(parent.WithMembers(members.Insert(index + 1, member))); } case SyntaxKind.StructDeclaration: { var parent = (StructDeclarationSyntax)member.Parent; SyntaxList <MemberDeclarationSyntax> members = parent.Members; int index = members.IndexOf(member); if (index == 0 && parent.OpenBraceToken.GetFullSpanEndLine() == member.GetFullSpanStartLine()) { member = member.WithLeadingTrivia(member.GetLeadingTrivia().Insert(0, NewLineTrivia())); } return(parent.WithMembers(members.Insert(index + 1, member))); } case SyntaxKind.InterfaceDeclaration: { var parent = (InterfaceDeclarationSyntax)member.Parent; SyntaxList <MemberDeclarationSyntax> members = parent.Members; int index = members.IndexOf(member); if (index == 0 && parent.OpenBraceToken.GetFullSpanEndLine() == member.GetFullSpanStartLine()) { member = member.WithLeadingTrivia(member.GetLeadingTrivia().Insert(0, NewLineTrivia())); } return(parent.WithMembers(members.Insert(index + 1, member))); } } return(null); }