一部の関数の呼び出しを防止する scala コンパイラ プラグインを作成したいと考えていました。たとえば、System.exit です。舞台裏のアイデアは、オンザフライで解釈される Scala スクリプトを人々が書けるようにすることです。しかし、いくつかの危険な行為は禁止されていることを確認したいと思います。
http://www.scala-lang.org/node/140の例から始めて、Apply セクションを置き換え始めました。いくつかのパターン マッチングを行うと、コンパイル ユニットの右側の部分の ClassSymbol を抽出できました。次に、次のような例のようなことをしたいと思いました:
classSymbol.tpe =:= global.typeOf[System]
残念ながら、それらは一致しません。一方に System.type を取得し、もう一方に System.type を取得します。
もちろん、文字列の値を比較することもできますが、おそらくこれを達成するためのより良い方法があると思います。誰かアドバイスはありますか?
念のため、コードの大部分:
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 _ => ()
}
}