2015-08-06 19 views
12

Sto cercando di scansionare un gruppo di file .cs per vedere quali chiamano la proprietà Value di un Nullable<T> (trovare tutti i riferimenti). Ad esempio, questo sarebbe partita:Ricerca di tutti i riferimenti a un metodo con Roslyn

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

Ho scoperto di Roslyn e guardato alcuni dei campioni, ma molti di loro sono obsolete e l'API è enorme. Come potrei fare questo?

Sono bloccato dopo aver analizzato l'albero della sintassi. Questo è quello che ho finora:

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

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

È necessario un modello semantico, che proviene da una raccolta. – SLaks

+0

Quale assembly è stato trovato in CSharpSyntaxTree per favore? –

+0

@Colonel Panic, CSharpSyntaxTree si trova nell'assembly Microsoft.CodeAnalysis.CSharp. – Anssssss

risposta

28

Probabilmente stai cercando per la classe SymbolFinder e in particolare il metodo FindAllReferences.

Sembra che tu abbia qualche problema a familiarizzare con Roslyn. Ho una serie di post sul blog per aiutare le persone a farsi conoscere a Roslyn chiamato Learn Roslyn Now.

Come @SLaks menzioni si sta andando ad avere bisogno di accedere al modello semantico, che copro in Part 7: Introduction to the Semantic Model

Ecco un esempio che mostra come l'API può essere utilizzato. Se sei in grado, userei MSBuildWorkspace e carica il progetto da disco invece di crearlo in un AdHocWorkspace come questo.

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;