2011-11-22 8 views
10

Tôi đang thử nghiệm một chút với Roslyn-CTP.Nhận TypeSyntax từ ITypeSymbol

Hiện tại tôi đang cố thay thế var bằng loại bê tông.

var i=1; 

nên trở thành:

int i=1; 

Tìm ra loại suy ra rất dễ dàng. Nhưng vì phần này xảy ra trong mô hình ngữ nghĩa, tôi nhận được ITypeSymbol. Sự thay thế xảy ra trong mô hình cú pháp, vì vậy tôi cần một số TypeSyntax. Vì tôi không muốn một tên cồng kềnh (global::System.Int32), việc chuyển đổi phụ thuộc vào ngữ cảnh (using, các loại lồng nhau, v.v.).

Phiên bản Visual Studio là một phần của Roslyn đã có chức năng này trong "Quickify type name" quickfix, nhưng nhìn qua các mẫu tôi không thể tìm thấy cách dễ dàng để thực hiện chuyển đổi này.


Dựa trên câu trả lời Kevin Pilch-Bisson của tôi hiện nay đang sử dụng:

var location = document.GetSyntaxTree().GetLocation(node); 
string name = variableType.ToMinimalDisplayString((Location)location, (SemanticModel)document.GetSemanticModel()); 

Một vị trí mà ToMinimalDisplayString thể được lấy từ một CommonSyntaxTree.

Một biến chứng nữa là ToMinimalDisplayString đòi hỏi các lớp LocationSemanticModel, trong khi document.GetSemanticModel()CommonSyntaxTree.GetLocation chỉ trả lại một giao diện.
Tôi đã làm việc xung quanh bằng cách chỉ đơn giản là truyền đến các lớp học, mà dường như làm việc cho bây giờ.

Hmm có vẻ như các lớp là C# cụ thể và ngôn ngữ giao diện độc lập.


Tôi đã tải lên một phiên bản làm việc trên github: https://github.com/CodesInChaos/Roslyn

Nó không làm việc cho var trong một foreach, nhưng tôi nghi ngờ đó là một hạn chế của việc xây dựng Roslyn hiện hành.

+2

câu nói cuối cùng của bạn: Đúng, chúng tôi không nhận được 'var' được triển khai đầy đủ trong' foreach' trước khi xây dựng CTP được hoàn tất, xin lỗi. –

Trả lời

12

Bạn có thể lấy chuỗi pháp ngắn nhất để đại diện cho một biểu tượng tại một địa điểm nhất định bằng cách sử dụng phương pháp ToMinimalDisplayString() mở rộng áp dụng cho ISymbol (lưu ý: Nó được tìm thấy trong `Roslyn.Compilers.CSharp.SymbolDisplay

Disclaimer:. Tôi làm việc tại Microsoft trên nhóm Roslyn

+10

BTW, bạn không cần từ chối trách nhiệm khi trả lời các câu hỏi _about_ sản phẩm của bạn. Tuyên bố từ chối trách nhiệm nên được sử dụng nếu bạn đang giới thiệu sản phẩm của mình – SLaks

+0

line, Harmless Promotion (của câu trả lời, không phải sản phẩm)? – sq33G

+3

@ sq33G: Trừ khi anh ta cố gắng chứng minh rằng anh ấy biết anh ấy đang nói gì, anh ta không cần dòng đó chút nào. Nếu anh ta có, anh ta có thể đặt nó trong dấu ngoặc đơn. – SLaks