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(); 
           }); 

Но, как я уже сказал, все ссылки не имеет места.

Null location

Когда я смотрю на все ссылки в VS (2015) - я получаю ссылки.

enter image description here


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; 
     } 
    } 

ответ

2

Вы создаете новый Compilation только с этим исходным файлом и без каких-либо соответствующих ссылок. Поэтому символ в этой компиляции не будет работать и, конечно же, не будет связан ни с чем в вашем существующем Solution.

Вам необходимо получить Compilation от Project, содержащий узел.

+0

Спасибо за быстрый ответ! Я попробую. Я подозревал, что это связано с созданием компиляции из дерева синтаксиса типа. Если вы понимаете, что говорите, мне нужно изменить создание компиляции на: 'var compilation = project.GetCompilationAsync(). Результат:' right? –

+0

Да, за исключением того, что вы должны называть это только один раз, вне вашей петли и «ждать». – SLaks

+0

Будет ли это также давать мне ссылки на перекрестные ссылки? –