2016-05-31 59 views
0

我正在嘗試使用Roslyn創建代碼重構擴展。我想要做的是根據我的默認命名空間重構命名空間。它成功的查找和替換的命名空間時,它僅僅是一個單詞,但是當我的名字空間看起來像kuku.riku.example和更改我的默認命名空間aaa結果是kuku.riku.aaa而不是隻aaa。我究竟做錯了什麼?創建名稱空間代碼使用Roslyn重構

我的代碼:

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

這還不支持,因爲加一個點可以創建非常複雜的角落情況下,如果在一個嵌套塊'using'新標識的衝突。 – SLaks

回答

1

RenameSymbolAsync重命名,你傳遞,就像你所看到的命名空間的只是一部分。支持命名空間重命名,添加或刪除點是我們想要構建的東西,但還沒有。

+0

你有一個想法,我怎麼能用當前版本做到這一點?順便說一句,我可以添加點名稱空間,但我不能刪除一個... –

+0

添加點的能力更多,因爲我們沒有阻止它,並可能有錯誤。在您添加代碼以支持核心的情況下,不支持點刪除。 –