Eksperymentuję trochę z Roslyn-CTP.Uzyskaj TypeSyntax od ITypeSymbol
Obecnie próbuję zastąpić var
konkretnym typem.
var i=1;
powinny stać się:
int i=1;
zastanawianie się wywnioskować typ jest łatwe. Ale ponieważ ta część dzieje się w semantycznym modelu otrzymuję ITypeSymbol
. Zastąpienie odbywa się w modelu składni, więc potrzebuję TypeSyntax
. Ponieważ nie chcę nadęty nazwa (global::System.Int32
), konwersja zależy od kontekstu (using
, typy zagnieżdżone itp.).
Wizualna wersja studyjna, która jest częścią Roslyn, ma już tę funkcję w swojej "Szybkiej łatce nazwy", ale patrząc na próbki, nie mogłem znaleźć łatwego sposobu na przeprowadzenie tej konwersji.
podstawie odpowiedzi Kevin Pilch-Bisson za Obecnie używam:
var location = document.GetSyntaxTree().GetLocation(node);
string name = variableType.ToMinimalDisplayString((Location)location, (SemanticModel)document.GetSemanticModel());
miejscu, które ToMinimalDisplayString
można otrzymać z CommonSyntaxTree
.
Dodatkową komplikacją jest to, że ToMinimalDisplayString
wymaga zajęcia Location
i SemanticModel
, natomiast document.GetSemanticModel()
i CommonSyntaxTree.GetLocation
zwrócić tylko interfejs.
Pracowałem, rzucając się na zajęcia, które na razie działają.
Hmm wygląda na to, że klasy są specyficzne dla C#, a interfejsy są niezależne od języka.
mam uploaded wersję roboczą na github: https://github.com/CodesInChaos/Roslyn
To nie działa na var
w foreach
, ale podejrzewam, że to ograniczenie bieżącej produkcji Roslyn.
Re: ostatnie stwierdzenie: poprawne, nie otrzymaliśmy 'var' w pełni zaimplementowanego w' foreach' przed sfinalizowaniem kompilacji CTP, przepraszam –