Мы пытаемся выяснить, как сгенерировать код с Roslyn. Я не говорю о чем-то вроде CSharpSyntaxTree.ParseText
, который возьмет несколько строк и преобразует их в AST. Вместо этого я хотел бы построить свою модель как-то вроде этого (псевдо-код):Создание семантического кода с roslyn
- Создать
file
в качестве единицы компиляции - Добавить класс
MyClass
вfile
- метод Add
DoSomething
дляMyClass
- Установить корпус
DoSomething
аналогичным образомSystem.Linq.Expressions
Мы недавно обнаружили Microsoft.CodeAnalysis.CSharp.SyntaxFactory
, и это казалось многообещающим. Однако, очевидно, мы должны сами добавлять мелочи.
После того, как вы построили дерево с помощью SyntaxFactory.CompilationUnit()
и добавили некоторые элементы назад и вперед, вывод ToFullString()
- это всего лишь куча текста, который не является ни удобочитаемым, ни компилируемым (например, отсутствующие фигурные скобки). Пропустили ли мы что-то при создании текста из модели?
EDIT:
При использовании рабочих областей, вы можете установить параметры, влияющие на поведение пробельных:
public string Generate (CompilationNode rootNode)
{
var cw = new CustomWorkspace();
cw.Options.WithChangedOption (CSharpFormattingOptions.IndentBraces, true);
var formattedCode = Formatter.Format (CreateFile(rootNode), cw);
return formattedCode.ToFullString();
}
Это уже дает лучший результат. Может ли кто-то подтвердить это как хорошее решение или это скорее взлом?
Одна проблема остается. Мы хотим создать авто-свойство, в настоящее время использующее SF.AccessorDeclaration
, но оно пропускает точку с запятой при преобразовании в полную строку.
Ваша цель - испустить код, не так ли? не скомпилировать его? – i3arnon
Да, но без явного указания мелочей. У меня также есть опыт использования SDK ReSharper, который в основном имеет ту же область применения. У них * есть * есть заводы, которые не обращают внимания на мелочи, и он печатает весь сгенерированный код, чистый и компилируемый. Я перекрестил некоторые комментарии других пользователей, предлагающих использовать CodeDOM, и что Roslyn предположительно не подходит для этого, но это будет казаться самым большим сбоем никогда :) – Matthias
Ну ... Roslyn, будучи компилятором, предназначен для использования кода, не производить. – i3arnon