Получить TypeSyntax от ITypeSymbol - PullRequest
11 голосов
/ 22 ноября 2011

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

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

var i=1;

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

int i=1;

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

Версия 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 # и не зависят от языка интерфейса.


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

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

1 Ответ

12 голосов
/ 22 ноября 2011

Вы можете получить самую короткую допустимую строку для представления символа в данном месте, используя метод расширения ToMinimalDisplayString(), который применяется к ISymbol (примечание: он находится в `Roslyn.Compilers.CSharp.SymbolDisplay.

Отказ от ответственности: я работаю в Microsoft в команде Roslyn.

...