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();
});
をしかし、私が言ったように、すべての参照には場所がありません。
私はVS内のすべての参照(2015)を探したとき - 私は参照を得ますか。
更新:
私は、コードを固定して、それが正しく動作するようになりました@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;
}
}
すばやくお返事ありがとうございます!私はそれを試してみましょう。私はそれが型の構文ツリーからコンパイルを作成することによると思った。あなたが言っていることを理解すれば、コンパイルの作成を次のように変更する必要があります: 'var compilation = project.GetCompilationAsync()。Result;' right? –
はい、ループの外で一度だけ呼び出す必要があり、 'await'する必要があります。 – SLaks
これはまた私にプロジェクト間参照の場所を与えるでしょうか? –