2015-08-06 5 views
12

Я ищу сканирование группы файлов .cs, чтобы узнать, какие из них называют Value свойством Nullable<T> (найти все ссылки). Например, это будет соответствовать:Поиск всех ссылок на метод с Roslyn

class Program 
{ 
    static void Main() 
    { 
     int? nullable = 123; 
     int value = nullable.Value; 
    } 
} 

я узнал о Рослин и смотрели на некоторые из образцов, но многие из них устарели и API огромен. Как мне это сделать?

Я застрял после разбора дерева синтаксиса. Это то, что я до сих пор:

public static void Analyze(string sourceCode) 
{ 
    var tree = CSharpSyntaxTree.ParseText(sourceCode); 

    tree./* ??? What goes here? */ 
} 
+2

Вам нужна семантическая модель, которая исходит из компиляции. – SLaks

+0

Какая сборка CSharpSyntaxTree найдена в пожалуйста? –

+0

@Colonel Panic, CSharpSyntaxTree находится в сборке Microsoft.CodeAnalysis.CSharp. – Anssssss

ответ

28

Вы, вероятно, ищете SymbolFinder класса и, в частности метода FindAllReferences.

Похоже, что у вас проблемы с знакомством с Рослин. У меня есть серия сообщений в блогах, чтобы помочь людям познакомиться с Рослином под названием Learn Roslyn Now.

Как @SLaks упоминает вы собираетесь иметь доступ к семантической модели, которую я покрываю в Part 7: Introduction to the Semantic Model

Вот пример, который показывает, как может быть использована API. Если вы в состоянии, я бы использовал MSBuildWorkspace и загрузил проект с диска вместо его создания в AdHocWorkspace следующим образом.

var mscorlib = PortableExecutableReference.CreateFromAssembly(typeof(object).Assembly); 
var ws = new AdhocWorkspace(); 
//Create new solution 
var solId = SolutionId.CreateNewId(); 
var solutionInfo = SolutionInfo.Create(solId, VersionStamp.Create()); 
//Create new project 
var project = ws.AddProject("Sample", "C#"); 
project = project.AddMetadataReference(mscorlib); 
//Add project to workspace 
ws.TryApplyChanges(project.Solution); 
string text = @" 
class C 
{ 
    void M() 
    { 
     M(); 
     M(); 
    } 
}"; 
var sourceText = SourceText.From(text); 
//Create new document 
var doc = ws.AddDocument(project.Id, "NewDoc", sourceText); 
//Get the semantic model 
var model = doc.GetSemanticModelAsync().Result; 
//Get the syntax node for the first invocation to M() 
var methodInvocation = doc.GetSyntaxRootAsync().Result.DescendantNodes().OfType<InvocationExpressionSyntax>().First(); 
var methodSymbol = model.GetSymbolInfo(methodInvocation).Symbol; 
//Finds all references to M() 
var referencesToM = SymbolFinder.FindReferencesAsync(methodSymbol, doc.Project.Solution).Result;