2015-01-15 2 views
0

Я пишу аннотацию макроса Scala @model, используемую для аннотирования классов case и которая автоматически добавляет некоторые метаданные к сопутствующему объекту аннотированного класса на основе полей класс аннотированного случая.Получение WeakTypeTag для заданного типа в аннотации макроса Scala

Я хотел бы получить дополнительную информацию о типе параметров класса case, особенно, проверить, реализуют ли они определенный признак. Я думал получить WeakTypeTag, потому что для них был путь, но я не могу понять, как они получены в макросах def.

Конкретно: я хочу, чтобы иметь возможность сказать, в данном случае, от макро реализации @model, что address поля User класса имеет тип, который проходит ModelObject, и что date не делает. Я могу это сделать?

trait ModelObject 
@model case case Address(street: String, city: String) extends ModelObject 
@model case class User(name: String, since: Date, address: Address) extends ModelObject 

ответ

1

Деревья, которые вступают в аргументы макрокоманды, целенаправленно нетипизированы. Однако запуск c.typeCheck(q"(??? : <tree that represents the parent>)").tpe предоставит недостающую информацию. Не забывайте duplicate, что дерево перед проверкой меток, потому что c.typeCheck мутирует дерево на месте, что может быть нежелательным.

Есть ограничения на то, что может сделать c.typeCheck. Для некоторых примеров этого см. Can't access Parent's Members while dealing with Macro Annotations.

+0

Спасибо большое, Юджин. Я пытаюсь «val tpe = c.typeCheck (q» (???: $ typeTree) »). Tpe', где' typeTree' является 'tpt' членом' ValDef', который я проверяю, но я получите ошибку «c.universe.Name ожидается, но c.universe.Tree found». Что мне не хватает? –

+0

Попробуйте вставить пробел между ??? а также :. –

+0

Отлично, это работает, спасибо большое! Является ли это особым прецедентом, что не потребовалось бы добавить что-то вроде 'c.typeOf (tree)', что бы это сделать? –