2012-08-30 14 views
8

Giả sử tôi có một tập tin nguồn mà trông như thế này:Tìm Định danh trong Semantic Mẫu

public class FieldReference 
{ 
    int field; 

    public FieldReference() 
    { 
     field = 1; 
    } 
} 

Tôi đang sử dụng một SyntaxRewriter đến thăm tất cả các định danh trong tập tin này. Trong phương thức VisitIdentifierName, tôi muốn tra cứu từ định danh trong mô hình ngữ nghĩa, để khám phá nếu một định danh dùng để chỉ một thành viên của lớp hiện tại.

Đây là những gì tôi có cho đến nay:

public override SyntaxNode VisitIdentifierName(IdentifierNameSyntax node) 
{ 
    SemanticModel model = this.compilation.GetSemanticModel(this.src); 
    // ?? look up identifier in compilation here ?? 
    return base.VisitIdentifierName(node); 
} 

Tuy nhiên tôi không thể tìm thấy đi để tìm kiếm các định danh trong mô hình Symantic - không có tình trạng quá tải của các phương pháp SemanticModel.GetDeclaredSymbol chấp nhận một IdentifierNameSyntax .

Bất kỳ ý tưởng nào về cách tôi nên thực hiện việc này?

Trả lời

9

Bạn nên sử dụng SemanticModel.GetSymbolInfo trên biểu thức (trong trường hợp cụ thể này là IdentifierNameSyntax).

GetDeclaredSymbol là để đi từ điểm khai báo (int field; ở trên) thành biểu tượng. Để thực hiện logic ràng buộc của trình biên dịch và xem biểu tượng nào biểu hiện cụ thể liên kết với, hãy sử dụng GetSymbolInfo.

+0

Cảm ơn Kevin, không chắc tôi đã bỏ qua điều đó như thế nào. Tất cả chỉ là rất mới với tôi tôi đoán! – Grokys

+0

hmm, điều này có vẻ bị hỏng trong phiên bản xem trước hiện tại của Roslyn. Xem dự án mẫu => ConvertToAutoPropertyCS => Bên trong PropertyRewriter => VisitFieldDeclaration (trường FieldDeclarationSyntax) Không có cách nào để lấy biểu tượng cho tham số trường. – mynkow

+0

Bởi vì khai báo trường có thể khai báo nhiều hơn một biểu tượng, bạn cần sử dụng biến VariableDeclaratorSyntax. –

Các vấn đề liên quan