1

我想创建一个可以防止调用某些函数的 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 _ => ()
      }
    }
4

1 回答 1

1

也许,

val jls = global.findMemberFromRoot(TermName("java.lang.System"))
于 2013-07-19T22:33:50.900 回答