【发布时间】:2014-01-12 20:27:28
【问题描述】:
yield 运算符是由编译器在后台实现的,该编译器生成一个实现符合IEnumerable 和IEnumerator 的状态机的类。
给定 Roslyn MethodDeclarationSyntax,可以像编译器通常那样创建 ClassDeclarationSyntax 并生成 MoveNext 方法。如果要编写支持yield 运算符的交叉编译器,则这种转换是必要的——首先要重写C# 代码以不使用yield 运算符,然后让交叉编译器从那里获取它。
但是,很明显,由于 Roslyn 可以端到端编译 C# 代码,它必须具有以某种方式执行此转换的逻辑,并且我自己实现此算法并非易事。
我的问题:该逻辑是否以某种方式公开,以便可以利用它来将给定的 MethodDeclarationSyntax 转换为相应的 ClassDeclarationSyntax 迭代器声明?还是它在Emit 阶段被烧毁,因此在SyntaxNodes 中工作时不可用?
【问题讨论】:
-
根据您的目标,翻译 IL 可能更简单。
-
没错,但我的交叉编译器是纯 C#->JS 编译器。