c# - 使用 Roslyn 创建命名空间代码重构

标签 c# roslyn roslyn-code-analysis

我正在尝试使用 Roslyn 创建代码重构扩展。我想要做的是根据我的默认命名空间重构命名空间。当 namespace 仅为单个单词时,它会成功找到并替换 namespace ,但是当我的 namespace 看起来像 kuku.riku.example 时,我将默认 namespace 更改为 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);
    }

最佳答案

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

关于c# - 使用 Roslyn 创建命名空间代码重构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37551568/

相关文章:

c# - 对值类型使用通用约束

c# - 如何找到 C# 项目中的所有硬编码值(解决方案)?

罗斯林 : How to get unresolved types

c# - 如何使用 Roslyn 将 XML 注释添加到 MethodDeclarationSyntax 节点?

c# - 函数参数(params object [])有什么区别

c# - 在 C# 中将 MSG 电子邮件转换为 PDF 文件

c# - 使用 Roslyn 替换方法节点

c# - 加载正在编写独立代码分析器的解决方案

c# - 查找包含给定 SyntaxNode 的 MethodDeclarationSyntax

c# - EnumerateFiles in drive 使用 LINQ 跳过回收站