Подтвердить что ты не робот

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

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

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

var i=1;

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

int i=1;

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

Версия Visual Studio, в которой часть Roslyn уже имеет эту функциональность в своем быстром имени "Simplify type name", но просматривая образцы, я не мог найти простой способ сделать это преобразование.


Основываясь на ответе Кевина Пильча-Биссона, я теперь использую:

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

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

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

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


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

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

4b9b3361

Ответ 1

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

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