在 Scala 2.9.3 编译器的擦除阶段之后获取具体类型的符号
Get reified type of symbol after the erasure phase of the Scala 2.9.3 compiler
我正在编写一个编译器插件,它将 Scala 的一个子集转换为 C++(忽略此任务的明显疯狂(。我正在使用许多必须在擦除阶段后运行的插件。但是,我需要完整的类型信息来输出有效的代码。
例如,对于斯卡拉;
def foo(f: Type1 => Type2): Unit = { /* Snip */ }
我想输出C++;
void foo(scala::Function1<Type1, Type2> f) { /* Snip */ }
但是,在擦除阶段之后,foo
如下所示:
def foo(f: Function1): Unit = { /* Snip */ }
即,参数 f
的泛型类型信息已丢失。我需要以某种方式将其取回。有什么建议吗?
回复 cdshines 的评论
下面是一个示例:
example.scala
object Example {
def func(f: Int => Boolean) { }
}
当我编译时;
# scalac -version
Scala compiler version 2.9.3 -- Copyright 2002-2011, LAMP/EPFL
# scalac -Xprint:explicitouter -Xprint:erasure example.scala
[[syntax trees at end of explicitouter]]// Scala source: example.scala
package <empty> {
final object Example extends java.lang.Object with ScalaObject {
def this(): object Example = {
Example.super.this();
()
};
def func(f: Int => Boolean): Unit = ()
}
}
[[syntax trees at end of erasure]]// Scala source: example.scala
package <empty> {
final object Example extends java.lang.Object with ScalaObject {
def this(): object Example = {
Example.super.this();
()
};
def func(f: Function1): Unit = ()
}
}
请注意 func
签名的变化。 explicitouter
是erasure
之前的阶段。
这个解决方案是由scala语言邮件列表提出的。在导入scala.tools.nsc.Global
的命名空间中,以下内容将在erasure
阶段之前恢复方法的类型(更具体地说是 AST 中的DefDef
(。
atPhase(currentRun.erasurePhase) { someDefDef.symbol.tpe }
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 在获取从文件到矢量的每一行之后,数字将被更改或销毁
- 有没有一种简单的方法可以在C++中获取特定索引之后向量中的所有项目?
- 在getline()之后获取字符串
- 从另一个线程调用shared_from_this但在初始化shared_ptr之后时获取bad_weak_ptr
- 获取提升程序选项以在函数范围之后保留
- 如果在获取互斥锁之后发生中断,会发生什么
- 获取 ISO 8601 时间戳 C++ 之前和之后的设置时间
- C 如何在文件中的特定字符串之后获取数字
- 在Popscene之后获取黑屏
- 在 Items.ItemAdd 事件之后获取邮件项目
- C ++拆分字符串并获取空格之后的部分
- 在Javascript服务器应用程序之后获取HTML
- 如何从 9 和 90 中提取 2.9 和 2.09,即获取数字等于最大编号的小数部分.二分位数之后的数字
- 在 RasDial 之后获取 IP 地址/接口号码
- 在 Scala 2.9.3 编译器的擦除阶段之后获取具体类型的符号
- 在特定项之后获取QString的一部分
- 在c++中获取内存之后的strlen
- 如何获取从sstream变量中提取的字符串之后的剩余字符串
- 如何在getline之后获取输入