Sto sperimentando un po 'con Roslyn-CTP.Ottieni TypeSyntax da ITypeSymbol
Attualmente sto cercando di sostituire var
con il tipo concreto.
var i=1;
deve diventare:
int i=1;
capire il tipo derivato è facile. Ma dal momento che questa parte si verifica nel modello semantico ottengo uno ITypeSymbol
. La sostituzione avviene nel modello di sintassi, quindi ho bisogno di un TypeSyntax
. Poiché non desidero un nome gonfio (global::System.Int32
), la conversione dipende dal contesto (using
, tipi nidificati, ecc.).
La versione di Visual Studio che fa parte di Roslyn ha già questa funzionalità nel suo quickfix "Simplify type name", ma guardando oltre gli esempi non ho trovato un modo semplice per fare questa conversione.
in base alla risposta di Kevin Pilch-Bisson Ora sto utilizzando:
var location = document.GetSyntaxTree().GetLocation(node);
string name = variableType.ToMinimalDisplayString((Location)location, (SemanticModel)document.GetSemanticModel());
Una posizione che ToMinimalDisplayString
può essere ottenuto da un CommonSyntaxTree
.
Un'ulteriore complicazione è che ToMinimalDisplayString
richiede le classi Location
e SemanticModel
, che document.GetSemanticModel()
e CommonSyntaxTree.GetLocation
restituire solo un'interfaccia.
Ho lavorato intorno al semplice casting per le classi, che sembra funzionare per ora.
Hmm sembra che le classi siano specifiche per C# e le interfacce indipendenti dalla lingua.
Ho caricato una versione funzionante su GitHub: https://github.com/CodesInChaos/Roslyn
Non funziona per var
in un foreach
, ma ho il sospetto che sia una limitazione della corrente di accumulo Roslyn.
Re: la tua ultima istruzione: corretto, non abbiamo ottenuto 'var' completamente implementato in' foreach' prima che il build del CTP fosse finalizzato, mi spiace. –