Я пытаюсь построить класс scala на основе некоторых классов 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] в качестве аргумента в аннотации, а затем сопоставить на c.macroApplication
с Apply(Select(Apply(_, List(TypeApply(_, List(catalog)))), _), _)
но типа я получаю это TypeApply(_, List(Trees$Ident)
, и я не вижу способа, чтобы получить класс оттуда (я предполагаю, что classOf [T] не является литералом).
В качестве альтернативы, я подумал, что попытаюсь извлечь тип, который я хочу, из свойства, что у меня есть объект. Я пробовал сопоставлять аннотацию с case List(q"object $name extends PlaceHolderTrait[$parent] { ..$body }")
, но опять же в конечном итоге с деревьями $ Ident и не уверен, как получить класс, на который ссылаются.
Я понимаю, что я мог бы просто передать строчку полного имени и использовать отражение, чтобы получить класс, но я надеялся на лучшую альтернативу. Обратите внимание, что я не привязан к этим двум альтернативам для указания класса, это всего лишь два варианта, которые я смог придумать.
Если у кого-то есть менее уродливый способ сделать это, я не принимаю свой ответ и принимаю его, но пока это кажется хорошо работать для моего дела. –