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