2015-08-06 8 views
12

Ich bin auf der Suche nach einer Gruppe von CS-Dateien, um zu sehen, welche die Value Eigenschaft eines Nullable<T> aufrufen (alle Referenzen zu finden). Zum Beispiel würde dieses Spiel:Alle Verweise auf eine Methode mit Roslyn finden

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

fand ich über Roslyn und sah einige der Proben an, aber viele von ihnen sind veraltet und die API ist riesig. Wie würde ich das machen?

Ich bin nach dem Parsen der Syntax Baum stecken. Das ist, was ich habe, so weit:

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

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

Sie benötigen ein semantisches Modell, das aus einer Zusammenstellung stammt. – SLaks

+0

In welcher Baugruppe wird CSharpSyntaxTree gefunden? –

+0

@Colon Panic, der CSharpSyntaxTree befindet sich in der Microsoft.CodeAnalysis.CSharp-Assembly. – Anssssss

Antwort

28

Sie sind wahrscheinlich für die SymbolFinder Klasse suchen und speziell die FindAllReferences Methode.

Es hört sich an, als hätten Sie Probleme, sich mit Roslyn vertraut zu machen. Ich habe eine Reihe von Blog-Posts, die den Leuten helfen sollen, sich mit Roslyn bekannt zu machen: Learn Roslyn Now.

Wie @SLaks erwähnt Sie gehen Zugang zum semantischen Modell müssen, die ich decken in Part 7: Introduction to the Semantic Model

Hier ist ein Beispiel, das Sie zeigt, wie die API verwendet werden kann. Wenn Sie dazu in der Lage sind, würde ich MSBuildWorkspace verwenden und das Projekt von der Festplatte laden, anstatt es in einer AdHocWorkspace so zu erstellen.

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;