【问题标题】:Is there a way to access the lowered C# AST in Roslyn有没有办法访问 Roslyn 中降低的 C# AST
【发布时间】:2021-11-15 05:04:08
【问题描述】:

我正在写一个tool,给定一段(可编译的)C#代码,生成另一个源,使用Mono.Cecil,输出一个与由编译原始代码。这是通过解析 C# 代码并访问生成的 AST 并生成对等效 Mono.Cecil API 的调用来实现的(我想这有点类似于 Roslyn 的代码生成部分所做的,但生成对 Mono.Cecil 的调用而不是 @ 987654329@)。

鉴于此,处理 给定 AST 的降低版本将使代码更易于实现、更健壮等,但查看 Roslyn 源代码似乎没有办法访问它.

在最好的情况下,我的代码需要调用负责降低 https://github.com/dotnet/roslyn/blob/main/src/Compilers/CSharp/Portable/Lowering 的各种类型,AFAICS 都是内部的。

问题出在哪里:真的不可能获得给定 AST 的降低版本

【问题讨论】:

标签: c# roslyn


【解决方案1】:

我们拥有的最接近“降低”的东西是我们的 IOperation API,它比语法/语义 API 低一点。我们没有 API 可以为您提供完全降低的表示。

【讨论】:

  • 我已经更新了这个问题,更明确地说明了我想要实现的目标(请记住,我不是编译器开发人员 :) 所以我的理解/期望可能完全不同);我所期望的是,在给定 AST 的情况下,有办法获得它的完全降低的版本(甚至不确定这在技术上是否可行)。 WRT IOperation APIs,这是我第一次听说它,但是快速浏览一下看起来并不乐观(无论如何,我稍后会更深入地查看)
  • 更新了答案,我们没有办法为您提供完全降低的表示,尽管此时如果您的 Mono.Cecil 输出正在查看操作码......只需发出然后反编译.
  • 我的工具没有查看 outputed IL.. 它正在派生应该发出哪个 Mono.Cecil API 调用以生成等效的 IL C# 编译器会产生。我希望使用降低的 AST 是为了简化/支持对异步、迭代器块等功能的处理
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 2015-09-16
  • 1970-01-01
相关资源
最近更新 更多