【问题标题】:Create Namespace Code Refactoring using Roslyn使用 Roslyn 创建命名空间代码重构
【发布时间】:2017-01-25 04:42:44
【问题描述】:

我正在尝试使用 Roslyn 创建代码重构扩展。我想要做的是根据我的默认命名空间重构命名空间。当命名空间只有单个单词时,它会成功找到并替换命名空间,但是当我的命名空间看起来像 kuku.riku.example 并且我将默认命名空间更改为 aaa 时,结果是 kuku.riku.aaa 而不仅仅是 aaa。我做错了什么?

我的代码:

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

【问题讨论】:

  • 目前还不支持,因为如果新标识符与嵌套块中的 using 冲突,添加点会产生非常复杂的极端情况。

标签: c# roslyn roslyn-code-analysis


【解决方案1】:

RenameSymbolAsync 仅重命名您传入的命名空间的一部分,如您所见。支持添加或删除点的命名空间重命名是我们想要构建的东西,但还没有。

【讨论】:

  • 您知道如何使用当前版本执行此操作吗?顺便说一句,我可以添加带点的命名空间,但我不能删除一个...
  • 添加点的能力更多是因为我们没有阻止它,并且可能有错误。如果您没有向核心添加支持它的代码,则不支持点删除。
猜你喜欢
  • 2015-06-11
  • 2017-03-04
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多