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

时间:2014-01-12 20:27:29

标签: yield roslyn

yield运算符由编译器实现,生成一个实现遵守IEnumerableIEnumerator的状态机的类。

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

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

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

1 个答案:

答案 0 :(得分:4)

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

目前,您必须自己实施。然而,Roslyn团队已经暗示将对公众CTP进行近期更新,并进行大量的API更改,因此您可以交叉使用,也许下一个版本将具有此功能。