查找解决方案中所有引用的位置
Finding location of all references across solution
我正在尝试使用 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;
}
}
您正在创建一个新的 Compilation
,其中只有那个源文件,没有相关参考。因此,该编译中的符号将不起作用,并且肯定不会绑定到现有 Solution
.
中的任何内容
您需要从包含节点的 Project
中获取 Compilation
。
我正在尝试使用 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;
}
}
您正在创建一个新的 Compilation
,其中只有那个源文件,没有相关参考。因此,该编译中的符号将不起作用,并且肯定不会绑定到现有 Solution
.
您需要从包含节点的 Project
中获取 Compilation
。