Получить TypeSyntax из ITypeSymbol

Я немного экспериментирую с Roslyn-CTP.

В настоящее время я пытаюсь заменить var конкретным типом.

var i=1;

должно стать:

int i=1;

Определить предполагаемый тип несложно. Но поскольку эта часть происходит в семантической модели, я получаю ITypeSymbol . Замена происходит в синтаксической модели, поэтому мне нужен TypeSyntax . Поскольку мне не нужно раздутое имя ( global :: System.Int32 ), преобразование зависит от контекста ( с использованием , вложенных типов и т. Д.).

Версия Visual Studio, входящая в состав Roslyn, уже имеет эту функциональность в быстром исправлении «Упростить имя типа», но, просмотрев примеры, я не смог найти простой способ выполнить это преобразование.


На основе ответа Кевина Пилч-Биссона я сейчас использую:

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

Местоположение, которое ToMinimalDisplayString можно получить из CommonSyntaxTree .

Дополнительная сложность заключается в том, что ToMinimalDisplayString требует классов Location и SemanticModel , тогда как document.GetSemanticModel () и CommonSyntaxTree.GetLocation возвращает только интерфейс.
Я работал, просто выполняя приведение к классам, что, похоже, пока работает.

Хм, похоже, классы специфичны для C #, а интерфейсы не зависят от языка.


Я загрузил рабочую версию на github: https://github.com/CodesInChaos/Roslyn

Это не работает для var в foreach , но я подозреваю, что это ограничение текущей сборки Roslyn.

11
задан CodesInChaos 2 December 2011 в 20:50
поделиться