2011-11-22 6 views
10

私はRoslyn-CTPを少し実験しています。ITypeSymbolからTypeSyntaxを取得

現在、varを具体的なタイプに置き換えようとしています。

var i=1; 

はなるはずです:

int i=1; 

が推測されたタイプは簡単です考え出します。しかし、この部分がセマンティックモデルで起こるので、私はITypeSymbolを得ます。置換は構文モデルで行われるので、TypeSyntaxが必要です。私は肥大化した名前(global::System.Int32)を望んでいないので、変換はコンテキストに依存します(using、ネストされたタイプなど)。

Roslynに所属しているVisualスタジオのバージョンでは、すでにこの機能が「簡易型の名前」クイックフィックスに含まれていますが、この変換を簡単に行うことができないサンプルを見ています。私が今使っているケビンPilch氏-Bissonの答えに基づいて


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

ToMinimalDisplayStringCommonSyntaxTreeから入手することができる場所。

追加の合併症はdocument.GetSemanticModel()CommonSyntaxTree.GetLocationのみインターフェイスを返す一方ToMinimalDisplayStringは、クラスLocationSemanticModelを必要とすることです。
私は単にクラスにキャストすることで作業しましたが、これは今のところうまくいくようです。

ちょっと、クラスがC#固有で、インターフェイスが言語に依存していないようです。それはforeachvarのために動作しませんhttps://github.com/CodesInChaos/Roslyn

が、私はそれが現在のロザリンのビルドの制限だ疑い:


私はgithubの上で作業バージョンをアップロードしました。

+2

Re:あなたの最後のステートメント:CTPビルドが完了する前に 'foreach'で' var'を完全に実装していませんでした。ごめんなさい。 –

答えて

12

あなたはISymbol(ノートに適用されるToMinimalDisplayString()拡張メソッドを使用して、指定された場所にシンボルを表現するために最短の法的な文字列を取得することができます:それはRoslyn.Compilers.CSharp.SymbolDisplay `で見つかった

免責事項:I

+10

ところで、あなたはあなたの製品を推薦している場合は、免責事項を使用する必要があります。 – SLaks

+0

ライン、無害プロモーション(答えの、製品ではない)? – sq33G

+3

@ sq33G:彼が何を語っているかを知っていることを実証しようとしていない限り、彼はその行をまったく必要としません。彼がいれば、カッコ内に入れることができます。 – SLaks

関連する問題