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

但正如我所說,所有引用沒有位置。

Null location

當我看到在VS的所有引用(2015年) - 我得到的引用。

enter image description here


更新:

跟進@Slacks意見,我有固定的代碼,它現在能正常使用。我在這裏張貼了對未來的Google參考...

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

回答

2

你僅與該源文件並沒有相關的引用創建新Compilation。因此,該彙編中的符號將不起作用,當然也不會受到現有Solution中的任何內容的約束。

您需要從包含節點的Project中獲取Compilation

+0

感謝您的快速回答!我會試一試。我懷疑這是由於從類型的語法樹創建編譯。如果明白你在說什麼,我需要將編譯創建改爲:'var compilation = project.GetCompilationAsync()。Result;'right? –

+0

是的,除了你應該只在你的循環之外調用一次,然後「等待」它。 – SLaks

+0

這也會給我跨項目引用地點嗎? –

相關問題