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意見,我有固定的代碼,它現在能正常使用。我在這裏張貼了對未來的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;
}
}
感謝您的快速回答!我會試一試。我懷疑這是由於從類型的語法樹創建編譯。如果明白你在說什麼,我需要將編譯創建改爲:'var compilation = project.GetCompilationAsync()。Result;'right? –
是的,除了你應該只在你的循環之外調用一次,然後「等待」它。 – SLaks
這也會給我跨項目引用地點嗎? –