2011-11-22 22 views
10

Roslyn-CTP ile biraz deneme yapıyorum.Get TypeSyntax from ITypeSymbol

Şu anda beton türü var'u değiştirmeye çalışıyorum.

var i=1; 

haline gelmelidir:
int i=1; 

türetilmiş tip bulmaktan kolaydır. Ancak bu kısım semantik modelde olduğu için bir ITypeSymbol aldım. Değiştirme sözdizimi modelinde olur, bu yüzden bir TypeSyntax'a ihtiyacım var. Şişirilmiş bir ad istemediğimden ( global::System.Int32), dönüştürme bağlam bağımlıdır ( using, iç içe türler vb.).

Roslyn'in bir parçası olan Visual Studio sürümü, bu işlevselliği "Basitleştirme türü adı" belgesinde zaten vardır, ancak bu dönüştürme işlemini gerçekleştirmenin kolay bir yolunu bulamadığım örnekleri gözden geçirdim. Şimdi kullanıyorum Kevin Pilch-BISSON cevabı dayanarak


:

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

ToMinimalDisplayString bir CommonSyntaxTree elde edilebilir bir konum.

bir başka zorluk document.GetSemanticModel() ve CommonSyntaxTree.GetLocation tek bir arayüz geri ise ToMinimalDisplayString sınıfları Location ve SemanticModel gerektirmesidir.
Şimdilik işe yaramış gibi görünen sınıflara dökerek çalıştım.

Hmm, sınıflar C# özelliğine ve arabirimler bağımsız olarak görünüyor. Bu bir foreach içinde var için çalışmaz https://github.com/CodesInChaos/Roslyn

, ama o anki Roslyn yapı bir sınırlama şüpheli:


github üzerinde çalışan bir sürümünü yükledim.

+2

Re: son ifadeniz: Doğru, CTP yapısının son haline getirilmesinden önce "foreach" uygulamasında "var" tam olarak uygulanmadık, üzgünüz. –

cevap

12

Sen ISymbol (nota geçerlidir ToMinimalDisplayString() uzatma yöntemini kullanarak belirli bir yerde bir sembol temsil etmek en kısa yasal dizeyi alabilirsiniz: Bu Roslyn.Compilers.CSharp.SymbolDisplay `bulduğunu

Destek. Ben Microsoft'ta Roslyn ekibinde çalışın

+10

BTW, Ürününüzü _about_ sorularına cevap verirken sorumluluk reddi beyanı Ürününüzü tavsiye ediyorsanız, sorumluluk reddi beyanı kullanılmalıdır – SLaks

+0

Öyleyse nasıl öneriyor? çizgi, Zararsız Promosyon (cevap değil, ürün değil)? – sq33G

+3

@ sq33G: Ne konuştuğunu bildiğini göstermeye çalışmazsa, o çizgiye hiç ihtiyaç duymaz. Öyleyse, parantez içine alabilirdi. – SLaks