Roslyn是否将编译器生成的yield转换暴露给语法树?

Kir*_*oll 5 yield roslyn

yield操作员是由编译器在引擎盖下实现生成一个实现状态机附着于一个类IEnumerableIEnumerator.

给定一个Roslyn MethodDeclarationSyntax,可以像编译器通常那样创建ClassDeclarationSyntax和生成一个MoveNext方法.如果编写一个支持yield运算符的交叉编译器,则必须进行此转换- 首先要重写C#代码以不使用yield运算符,然后让交叉编译器从那里获取它.

但是,很明显,由于Roslyn可以端到端地编译C#代码,因此它必须具有以某种方式执行此转换的逻辑,并且自己实现此算法非常重要.

我的问题:是否以这样的方式暴露逻辑,即可以利用它将给定MethodDeclarationSyntax转换为相应的ClassDeclarationSyntax迭代器声明?或者它是否在Emit阶段被烘焙,因此在SyntaxNodes中工作时无法使用?

Tri*_*ian 4

当前的 Roslyn 位将迭代器方法作为代码生成阶段的一部分进行处理。不幸的是,这个阶段大部分是不透明的,并且使用不向公共 API 公开的内部表示。Roslyn.Compilers.CSharp.IteratorRewriter如果您想深入研究的话,内部类就是实现它的地方。

目前,您必须自己实现这一点。然而,Roslyn 团队暗示将在不久的将来对公共 CTP 进行更新,并对 API 进行大量更改,因此请祈祷,也许下一个版本将具有此功能。