0

Roslyn APIを使用して、ソリューション全体のすべてのタイプのすべての参照を検索しようとしています。ソリューション全体のすべての参照の場所を見つける

確かに、タイプ(SymbolFinder.FindReferencesAsyncを使用)への参照を取得しますが、を使用してその場所を確認すると、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アドバイスにフォローアップ。私はあなたが唯一のそのソースファイルと無関連文献で新しいCompilationを作成している

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

...のGooglerのための今後の参考のためにここでそれを掲示しています。したがって、そのコンパイルのシンボルは機能せず、あなたの既存のSolutionのものには拘束されません。

ノードを含むProjectからCompilationを取得する必要があります。

+0

すばやくお返事ありがとうございます!私はそれを試してみましょう。私はそれが型の構文ツリーからコンパイルを作成することによると思った。あなたが言っていることを理解すれば、コンパイルの作成を次のように変更する必要があります: 'var compilation = project.GetCompilationAsync()。Result;' right? –

+0

はい、ループの外で一度だけ呼び出す必要があり、 'await'する必要があります。 – SLaks

+0

これはまた私にプロジェクト間参照の場所を与えるでしょうか? –

関連する問題