我想创建一个可以防止调用某些函数的 scala 编译器插件。例如 System.exit。幕后的想法是让人们编写可以即时解释的 Scala 脚本。但我想确保禁止一些危险的行为——这样做的方式绝对可以讨论。
我从http://www.scala-lang.org/node/140中的示例开始,并开始替换 Apply 部分。做一些模式匹配我能够为编译单元的正确部分提取一个 ClassSymbol。然后我想做类似示例中的操作:
classSymbol.tpe =:= global.typeOf[System]
不幸的是,它们不匹配,我在一侧得到 System.type,在另一侧得到 System。
当然我可以比较字符串值,但我认为可能有更好的方法来实现这一点。有没有人有任何建议?
以防万一大部分代码:
def apply(unit: global.CompilationUnit) {
for (global.Apply(fun, _) <- unit.body) {
fun.symbol match {
case method: global.MethodSymbol =>
val classSymbol = method.owner
println(classSymbol.fullName)
println(classSymbol.tpe =:= global.typeOf[System])
case _ => ()
}
}