Я пытаюсь найти все ссылки для всех типов в решении с помощью 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) - я получаю ссылки.
Update:
Вслед за советом @Slacks я установил код и он теперь работает должным образом. Я отправляю его здесь в будущем для Googlers ...
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(). Результат:' right? –
Да, за исключением того, что вы должны называть это только один раз, вне вашей петли и «ждать». – SLaks
Будет ли это также давать мне ссылки на перекрестные ссылки? –