2016-05-31 12 views
0

Roslynを使用してコードリファクタリング拡張を作成しようとしています。私がしたいことは、デフォルトの名前空間に従ってリファクタの名前空間です。名前空間が見つからない場合は、名前空間がkuku.riku.exampleのようになり、デフォルトの名前空間をaaaに変更すると、結果はaaaではなくkuku.riku.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

新しい識別子がネストされたブロックで '使用中 'と衝突すると、ドットを追加すると非常に複雑なコーナーケースが作成される可能性があるため、これはまだサポートされていません。 – SLaks

答えて

1

RenameSymbolAsyncは、あなたが渡している名前空間のほんの一部の名前を変更します。ドットを追加または削除する名前空間の名前変更をサポートすることは、私たちが構築したいと思っていたものですが、まだ実現していないものです。

+0

現在のバージョンでどうすればいいですか?ちなみに名前空間にドットを追加することはできますが、削除することはできません。 –

+0

ドットを追加する機能は、ブロックしなかったためにバグがある可能性があります。コアにサポートするためのコードを追加していないと、ドットの削除だけがサポートされていません。 –

関連する問題