0

我正在尝试使用Roslyn API.

果然,我确实得到了对类型的引用(使用SymbolFinder.FindReferencesAsync),但是当我检查它们的位置(使用SymbolFinder.FindSourceDefinitionAsync)时,我得到了一个null结果。

到目前为止我尝试了什么?

我正在使用以下方法加载解决方案:
this._solution = _msWorkspace.OpenSolutionAsync(solutionPath).Result;

并使用以下方法获取参考:

List<ClassDeclarationSyntax> solutionTypes = this.GetSolutionClassDeclarations();

var res = solutionTypes.ToDictionary(t => t,
                              t =>
                              {
                                  var compilation = CSharpCompilation.Create("MyCompilation", new SyntaxTree[] { t.SyntaxTree }, new[] { MetadataReference.CreateFromFile(typeof(object).Assembly.Location) });
                                  var semanticModel = compilation.GetSemanticModel(t.SyntaxTree);
                                  var classSymbols = semanticModel.GetDeclaredSymbol(t);

                                  var references = SymbolFinder.FindReferencesAsync(classSymbols, this._solution).Result;
                                  foreach (var r in references)
                                  {
                                        //=== loc is allways null... ===
                                      var loc = SymbolFinder.FindSourceDefinitionAsync(r.Definition, this._solution).Result;
                                  }

                                  return references.ToList();
                              });

但正如我所说,所有引用都没有位置。

空位置

当我在 VS (2015) 中查找所有参考资料时 - 我确实得到了参考资料。

在此处输入图像描述


更新:

跟进@Slacks 的建议,我已经修复了代码,现在它可以正常工作了。我将其发布在这里以供googlers将来参考...

    Dictionary<Project, List<ClassDeclarationSyntax>> solutionTypes = this.GetSolutionClassDeclarations();

    var res = new Dictionary<ClassDeclarationSyntax, List<ReferencedSymbol>>();
    foreach (var pair in solutionTypes)
    {
        Project proj = pair.Key;
        List<ClassDeclarationSyntax> types = pair.Value;
        var compilation = proj.GetCompilationAsync().Result;
        foreach (var t in types)
        { 
            var references = new List<ReferencedSymbol>();

            var semanticModel = compilation.GetSemanticModel(t.SyntaxTree);
            var classSymbols = semanticModel.GetDeclaredSymbol(t);

            references = SymbolFinder.FindReferencesAsync(classSymbols, this._solution).Result.ToList();

            res[t] = references;
        }
    }
4

1 回答 1

2

您正在创建一个Compilation仅包含该源文件且没有相关参考的新文件。因此,该编译中的符号将不起作用,并且肯定不会绑定到您现有的任何Solution.

您需要CompilationProject包含节点中获取。

于 2017-01-09T17:54:43.710 回答