我想创建一个scala编译器插件,可以阻止某些函数的调用。例如System.exit。 这个场景背后的想法是让人们编写可以即时解释的Scala脚本。但我想确保禁止某些危险行为 - 绝对可以讨论它的做法。
我从http://www.scala-lang.org/node/140中的示例开始,并开始替换Apply部分。 做一些模式匹配我能够为编译单元的右侧部分提取ClassSymbol。 然后我想做一些类似于例子的事情:
classSymbol.tpe =:= global.typeOf[System]
不幸的是它们不匹配我一方面得到System.type而另一方面得系统。
当然我可以比较String值,但我认为可能有更好的方法来实现这一点。 有人有什么建议吗?
以防大部分代码:
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 _ => ()
}
}
答案 0 :(得分:1)
也许,
val jls = global.findMemberFromRoot(TermName("java.lang.System"))