Encontrar todas las referencias a un método con Roslyn

Estoy buscando escanear un grupo de archivos .cs para ver cuáles llaman a la propiedad Value de un Nullable (encontrar todas las referencias). Por ejemplo, esto coincidiría:

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

Descubrí a Roslyn y miré algunas de las muestras, pero muchas de ellas están desactualizadas y la API es enorme. ¿Cómo voy a hacer esto?

Estoy atrapado después de analizar el árbol de syntax. Esto es lo que tengo hasta ahora:

 public static void Analyze(string sourceCode) { var tree = CSharpSyntaxTree.ParseText(sourceCode); tree./* ??? What goes here? */ } 

Probablemente estés buscando la clase SymbolFinder y específicamente el método FindAllReferences .

Parece que tienes problemas para familiarizarte con Roslyn. Tengo una serie de publicaciones en el blog para ayudar a las personas a conocer a Roslyn llamada Learn Roslyn Now .

Como @SLaks menciona, vas a necesitar acceder al modelo semántico que cubro en la Parte 7: Introducción al Modelo Semántico

Aquí hay un ejemplo que muestra cómo se puede usar la API. Si puede, usaría MSBuildWorkspace y cargaría el proyecto desde el disco en lugar de crearlo en un AdHocWorkspace como este.

 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().First(); var methodSymbol = model.GetSymbolInfo(methodInvocation).Symbol; //Finds all references to M() var referencesToM = SymbolFinder.FindReferencesAsync(methodSymbol, doc.Project.Solution).Result;