Ich versuche Code Refactoring Erweiterung mit Roslyn zu erstellen. Was ich tun möchte, ist Namespaces nach meinem Standard Namespace neu zu gestalten. Es ist erfolgreich, den Namespace zu finden und zu ersetzen, wenn es nur ein einzelnes Wort ist, aber wenn mein Namespace so aussieht kuku.riku.example
und ich meinen Standardnamensraum zu aaa
ändere, ist das Ergebnis kuku.riku.aaa
anstatt nur aaa
. Was mache ich falsch?Create Namespace Code Refactoring mit Roslyn
Mein Code:
public sealed override async Task ComputeRefactoringsAsync(CodeRefactoringContext context)
{
SyntaxNode node = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);
NamespaceDeclarationSyntax namespaceDec = (NamespaceDeclarationSyntax)node.ChildNodes()
.FirstOrDefault(syntaxNode => syntaxNode as NamespaceDeclarationSyntax != null);
string defaultNamespace = GetDefaultNamespace(context.Document);
if (defaultNamespace != namespaceDec.Name.ToString())
{
var action = CodeAction.Create("Adjust Namespaces", c => AdjustNamespacesAsync(context.Document, namespaceDec, defaultNamespace, context.CancellationToken));
// Register this code action.
context.RegisterRefactoring(action);
}
}
private static async Task<Solution> AdjustNamespacesAsync(Document document, NamespaceDeclarationSyntax declerationSyntax, string newName, CancellationToken cancelationToken)
{
SemanticModel semanticModel = await document.GetSemanticModelAsync(cancelationToken);
var fist = declerationSyntax.Span;
INamespaceSymbol symbol = semanticModel.GetDeclaredSymbol(declerationSyntax, cancelationToken);
Solution origionalSolution = document.Project.Solution;
OptionSet workspaceOptions = document.Project.Solution.Workspace.Options;
return await Renamer.RenameSymbolAsync(origionalSolution, symbol, newName, workspaceOptions, cancelationToken);
}
Dies wird noch nicht unterstützt, da das Hinzufügen eines Punkts sehr komplizierte Eckfälle erzeugen kann, wenn der neue Bezeichner mit einem 'using' in einem verschachtelten Block in Konflikt steht. – SLaks