1
컴파일러 플러그인을 변경하려고합니다. 다른 사람이 typer 바로 다음으로 실행하고 쓴 예외를 throw하는 코드를 생성하려고합니다.스칼라 컴파일러가 throw 코드를 생성합니다
예외 클래스는 다음과 같습니다
실제 코드에서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
...
를? 스칼라 메일 링리스트의