使用Scala Compiler插件将一些方法调用列入黑名单

时间:2013-07-19 21:21:47

标签: scala compiler-construction

我想创建一个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 _ => ()
      }
    }

1 个答案:

答案 0 :(得分:1)

也许,

val jls = global.findMemberFromRoot(TermName("java.lang.System"))