제 3 자 어노테이션 전 처리기에서 생성 한 일부 Java 클래스를 기반으로 스칼라 클래스를 작성하려고합니다.매크로 어노테이션의 인수로 클래스를 사용할 수 있습니까?
내가 예를 들어 주석 객체에서 클래스 "포인트", 수 있도록하고 싶습니다 :
@MyAnnotation(classOf[GeneratedJavaClass]) object MyObject
또는
@MyAnnotation object MyObject extends PlaceHolderTrait[GeneratedJavaClass]
내가 실제 매크로 구현에있어 일단
, GeneratedJavaClass를 반영하여 MyObject의 구현을 빌드하는 데 사용할 구성원을 찾습니다.지금까지 시작점은 https://github.com/travisbrown/type-provider-examples/blob/master/rdfs-public/src/main/scala/public/PrefixGenerator.scala을 기준으로합니다.
은 내가 주석에 인자로 클래스 [T]를 걸릴 수 있습니다 방법을 이해하고 Apply(Select(Apply(_, List(TypeApply(_, List(catalog)))), _), _)
와 c.macroApplication
에 일치하지만 내가 할 유형이 TypeApply(_, List(Trees$Ident)
입니다 시도한 내가 얻을 수있는 방법이 표시되지 않습니다 클래스 (classOf [T]가 리터럴이 아닙니다.)를 가정합니다.
대안으로 나는 개체 확장이있는 특성에서 원하는 유형을 추출하려고한다고 생각했습니다. case List(q"object $name extends PlaceHolderTrait[$parent] { ..$body }")
에 대한 annotee를 매치했지만 나무 $ Ident로 끝나고 참조되는 클래스를 얻는 방법을 모르겠습니다.
아마도 정규화 된 이름의 String을 전달하고 클래스를 가져 오기 위해 리플렉션을 사용할 수 있지만 더 나은 대안을 기대하고있었습니다. 클래스를 지정하는 두 가지 대안에 묶여 있지 않다는 점에 유의하십시오.이 두 가지 옵션은 제가 생각해 낼 수있는 두 가지 옵션입니다.
다른 사람이 이것을 못하게하는 추악한 방법이 있다면, 저는 제 대답을 받아들이지 않을 것이고, 내 경우에는 잘 작동합니다. –