2015-07-18 3 views
1

У меня есть следующий код:Как мне получить доступ к родовому типу в аннотации макросов в Scala?

@compileTimeOnly("enable macro paradise to expand macro annotations") 
class typedTable[T] extends StaticAnnotation { 
    def macroTransform(annottees: Any*): Table = macro TableGenerator.impl[T] 
} 

object TableGenerator { 
    def impl[T](c: whitebox.Context)(annottees: c.Expr[Any]*): c.Expr[Table] = { 
    import c.universe._ 
    val tpe = weakTypeOf[T] // This doesn't work 
    ... 
    } 
} 

И я не могу понять, как получить доступ к TypeTag для «T» в Macro Аннотация. Я видел другие сообщения, которые содержат туманную ссылку на то, как можно получить доступ, но я не могу точно понять, как я должен получить к нему доступ в этом контексте.

ответ

2

Макро-аннотации не типируют их аргументы, а это значит, что вы можете получать деревья только от этих аргументов, а не от их типов. Чтобы получить деревья, представляющие аргументы типа вашей аннотации макросов, вызовите c.macroApplication и соответствующим образом разрушите их.

+0

Прошу прощения, но я все еще очень новичок в Макросах, можете ли вы объяснить немного больше, что мне нужно сделать? Я хочу перебирать поля в основном конструкторе, предполагая, что T является классом case. – darkfrog

+0

Посмотрите на это: http://stackoverflow.com/questions/19379436/cant-access-parents-members-while-dealing-with-macro-annotations, и, надеюсь, это ответит на ваш вопрос. Пожалуйста, не стесняйтесь спрашивать больше, если вы застряли. –

Смежные вопросы