2016-05-31 8 views
0

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); 
    } 
+0

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

Antwort

1

RenameSymbolAsync umbenennt nur den Teil des Namespace, der im Vorbeigehen sind, wie Sie sehen. Unterstützender Namespace benennt, dass das Hinzufügen oder Entfernen von Punkten etwas ist, das wir erstellen wollten, aber noch nicht haben.

+0

Hast du eine Idee wie kann ich das mit der aktuellen Version machen? übrigens kann ich Namespace mit Punkten hinzufügen, aber ich kann einen nicht entfernen ... –

+0

Die Fähigkeit, Punkte hinzuzufügen, ist mehr, weil wir es nicht blockierten, und könnte Fehler haben. Abgesehen davon, dass Sie Code hinzufügen, um ihn im Kern zu unterstützen, wird die Punktentfernung einfach nicht unterstützt. –