【问题标题】:Roslyn: How to get candidate namespaces for unresolved typesRoslyn:如何获取未解析类型的候选命名空间
【发布时间】:2015-06-02 20:45:01
【问题描述】:

使用 Roslyn,有没有一种方法可以获得列表中每个未解析符号的候选命名空间列表?如果是这样,有没有办法可以对属于多个可能的命名空间的具有歧义的符号进行“最佳匹配”?

我想为文件中未解析的符号生成 using 语句列表。我可以使用Roslyn : How to get unresolved types 之类的方法从语义信息中获取未解析的符号,但无法从项目中引用的程序集中找到这些符号的命名空间。

【问题讨论】:

    标签: c# .net types namespaces roslyn


    【解决方案1】:

    我浏览了 Roslyn Repo,当他们认为用户缺少 using 时,他们似乎使用 SymbolFinder 检索信息:请参阅 here.

    至于找到“最佳”匹配,我相信您必须根据您认为的“最佳”匹配来实施。 Visual Studio 只是向您显示所有候选 using 语句。

    这是我快速拼凑的一个示例,用于演示SymbolFinder

    var ws = new AdhocWorkspace();
    var solutionInfo = SolutionInfo.Create(SolutionId.CreateNewId();, VersionStamp.Create());
    var solution = ws.AddSolution(solutionInfo);
    var project = ws.AddProject("Sample", "C#");
    
    //Add reference to mscorlib
    var mscorlib = PortableExecutableReference.CreateFromAssembly(typeof(object).Assembly);
    project = project.AddMetadataReference(mscorlib);
    ws.TryApplyChanges(project.Solution);
    
    string text = @"
    class C
    {
        void M()
        {
            //Missing a using System;
            Console.Write();
        }
    }";
    var sourceText = SourceText.From(text);
    
    //Add document to project
    var doc = ws.AddDocument(project.Id, "NewDoc", sourceText);
    var model = doc.GetSemanticModelAsync().Result;
    var unresolved = doc.GetSyntaxRootAsync().Result.DescendantNodes().OfType<IdentifierNameSyntax>()
       .Where(x => model.GetSymbolInfo(x).Symbol == null);
    
    foreach (var identifier in unresolved)
    {
        var candidateUsings = SymbolFinder.FindDeclarationsAsync(doc.Project, identifier.Identifier.ValueText, ignoreCase: false).Result;
    
        //Process candidate usings...
    }
    

    【讨论】:

    • 感谢 Josh Varty,我正在寻找 SymbolFinder 的 FindDeclaractions。从 Roslyn 源代码中指出用法的额外功劳。
    猜你喜欢
    • 2023-03-22
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 2019-12-23
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多