2012-12-04 6 views
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 
... 

를? 스칼라 메일 링리스트의

답변

2

누군가가 나에게 솔루션을 말했다 :

나는, 내가 전화하는 것을 목적으로하는 경우, 후자는 사용하지 모듈의 클래스의 상징을 필요로 다른 기호를 얻어야한다 등 거기에 방법이 있지만, 우리는 내가

val symbol = rootMirror.getClassByName(newTermName(exceptionName)) 
쓰기 여기에 클래스, 그래서 대신

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

필요

관련 문제