1

タイパーの直後に実行される他の人が書いたコンパイラプラグインを変更しようとしていますが、例外をスローするコードを生成したいと思います。

Exceptionクラスは次のようになります。

case class MyException(message: String) extends Exception(message)

ただし、実際のコードでは、これは内部クラスです。

私は彼がどのように固定クラスのシンボルを取得したかを見て、同様にそれを行いました。より良い方法があるかどうかはわかりませんが、彼がそれをどのように行ったかは次のとおりです。

val exceptionClass = MyException.getClass.getName
val exceptionName = if (exceptionClass.last == '$') exceptionClass.dropRight(1) else exceptionClass
val symbol = rootMirror.getModuleByName(newTermName(exceptionName))

例外をスローするために、私はこれを行いました:

import CODE._
THROW(symbol, Literal(Constant("My message")))

私は、以下も同等であると思います(そして同等の振る舞いを生み出します)

Throw(symbol.tpe, Literal(Constant("My Message")))
Throw(NEW(symbol, Literal(Constant("My message"))))
Throw(New(symbol.tpe, Literal(Constant("My message"))))

しかし、私は例外を受け取りました:

== Enclosing template or block ==

Apply( // val <error>: <error> in class <error>
  new MyException.type."<init>" // val <error>: <error> in class <error>, tree.tpe=<error>
  Nil
)

== Expanded type of tree ==

TypeRef(TypeSymbol(class MyException extends ))

uncaught exception during compilation: scala.reflect.internal.Types$TypeError
error: scala.reflect.internal.Types$TypeError: MyException.type does not have a constructor
...

私はどういうわけか「新しい」を別の方法で使用する必要があると思いますが、これが正しく行われる方法を誰かが知っていますか?

4

1 に答える 1

2

Scalaメーリングリストの誰かが私に解決策を教えてくれました:

シンボルを別の方法で取得する必要があります。モジュールではなくクラスのシンボルが必要です。後者は、メソッドを呼び出すオブジェクトなどの場合に使用されますが、ここではクラスが必要なので、代わりに

val symbol = rootMirror.getModuleByName(newTermName(exceptionName))

私は書きます

val symbol = rootMirror.getClassByName(newTermName(exceptionName))
于 2012-12-04T18:44:25.273 に答える