2011-11-22 13 views
10

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.

+2

Re: la tua ultima istruzione: corretto, non abbiamo ottenuto 'var' completamente implementato in' foreach' prima che il build del CTP fosse finalizzato, mi spiace. –

risposta

12

È possibile ottenere la stringa legale più breve per rappresentare un simbolo in una data posizione utilizzando il metodo ToMinimalDisplayString() estensione che si applica a ISymbol (nota: Si trova in `Roslyn.Compilers.CSharp.SymbolDisplay

. Disclaimer: I lavoro presso Microsoft nel team di Roslyn

+10

BTW, non hai bisogno di un dichiarazione di non responsabilità quando si risponde alle domande _dopo_il prodotto. Se si consiglia il prodotto, è necessario utilizzare le dichiarazioni di non responsabilità – SLaks

+0

line, Promozione innocua (di risposta, non di prodotto)? – sq33G

+3

@ sq33G: A meno che non stia cercando di dimostrare di sapere di cosa parla, non ha assolutamente bisogno di quella linea. Se lo è, potrebbe metterlo tra parentesi. – SLaks