Roslyn:如何为未解析的类型获取候选命名空间

时间:2015-03-29 23:00:12

标签: c# .net types namespaces roslyn

使用Roslyn,有没有办法可以为列表中的每个未解析符号获取候选命名空间列表?如果是这样,有没有办法可以做到最好的匹配'对于具有歧义的符号,它们属于多个可能的命名空间?

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

1 个答案:

答案 0 :(得分:3)

我浏览了Roslyn Repo,当他们认为用户遗漏了SymbolFinder时,看起来他们使用using来检索信息:请参阅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...
}