Оператор yield
реализован под капотом компилятором, производящим класс, который реализует конечный автомат, придерживаясь IEnumerable
и IEnumerator
.Разве Рослин подвергает преобразованиям генерируемых компилятором преобразований деревьям синтаксиса?
Придано Roslyn MethodDeclarationSyntax
, можно создать ClassDeclarationSyntax
и сгенерировать метод MoveNext
, как это обычно делает компилятор. Это преобразование необходимо, если вы пишете кросс-компилятор, который должен поддерживать оператор yield
- сначала нужно будет переписать код C#, чтобы не использовать оператор yield, а затем позволить кросс-компилятору взять его оттуда.
Однако ясно, что поскольку Roslyn может скомпилировать код C# от конца до конца, он должен иметь логику для выполнения этого преобразования в некотором роде, и реализация этого алгоритма сама по себе довольно нетривиальна.
Мой вопрос: является ли эта логика открытой таким образом, что можно использовать ее для преобразования заданного MethodDeclarationSyntax
в соответствующее объявление итератора ClassDeclarationSyntax
? Или он запекается на фазе Emit
и, таким образом, недоступен при работе с SyntaxNode
?
В зависимости от ваших целей, это может быть проще для перевода ИЛ. – zneak
Правда, но мой кросс-компилятор - это чисто компилятор C# -> JS. –