2016-05-31 6 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

점을 추가 할 수있는 능력은 우리가 그것을 막지 않았고 버그가있을 수 있기 때문입니다. 코드를 코어에 추가하기 위해 코드를 추가하지 않아도 점 제거는 지원되지 않습니다. –