2015-08-06 19 views
12

Tôi đang tìm cách quét một nhóm tệp .cs để xem tệp nào gọi thuộc tính Value của số Nullable<T> (tìm tất cả các tham chiếu). Ví dụ: điều này sẽ khớp với:Tìm tất cả các tham chiếu đến một phương thức với Roslyn

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

Tôi đã tìm hiểu về Roslyn và xem một số mẫu, nhưng nhiều trong số đó đã lỗi thời và API rất lớn. Tôi sẽ đi đâu để tới đó?

Tôi bị kẹt sau khi phân tích cú pháp cây cú pháp. Đây là những gì tôi có cho đến nay:

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

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

Bạn cần một mô hình ngữ nghĩa, bắt nguồn từ một trình biên dịch. – SLaks

+0

Việc lắp ráp CSharpSyntaxTree là gì? –

+0

@Colonel Panic, CSharpSyntaxTree nằm trong hội đồng Microsoft.CodeAnalysis.CSharp. – Anssssss

Trả lời

28

Bạn đang có lẽ tìm kiếm các lớp SymbolFinder và đặc biệt là phương pháp FindAllReferences.

Có vẻ như bạn đang gặp khó khăn khi làm quen với Roslyn. Tôi đã có một loạt bài đăng trên blog để giúp mọi người được giới thiệu với Roslyn được gọi là Learn Roslyn Now.

Như @SLaks đề cập đến bạn sẽ cần truy cập vào các mô hình ngữ nghĩa mà tôi trang trải trong Part 7: Introduction to the Semantic Model

Dưới đây là một ví dụ cho thấy bạn như thế nào API có thể được sử dụng. Nếu bạn có thể, tôi sẽ sử dụng MSBuildWorkspace và tải dự án từ đĩa thay vì tạo nó trong một AdHocWorkspace như thế này.

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; 
Các vấn đề liên quan