2014-10-19 5 views
0

Я пытаюсь написать макрос в Scala, который читает переменные с определенными аннотациями, чтобы манипулировать ими, но кажется аннотации свойство переменных символов всегда возвращает пустой список.Невозможно прочитать переменные аннотации из макроса Scala

Аннотация подписи: использование

class Inject extends StaticAnnotation 

Аннотация:

object App { 
    @Inject 
    var service: HttpService = _ 
} 

Макроопределение (черный ящик):

def inject[T <: Config](c: Context)(target: c.Expr[T])(implicit tag: c.WeakTypeTag[T]): c.Expr[ModuleProxy] = { 
    import c.universe._ 

    val fields = tag.tpe.members collect { case s: TermSymbol => s} 

    // Always empty. 
    fields foreach { s => println(s"$s : ${s.annotations}") } 
} 

Есть ли что-то я должен смотреть в? Любые предложения будут высоко оценены.

Спасибо!

+0

Не могли бы вы разместить полный пример на, скажем, github? –

+0

@EugeneBurmako Конечно, это уже в GH, но я удалил соответствующую часть, потому что она не работала. Я включу его снова с комментариями и опубликую ссылку здесь в эти выходные. Благодаря! – mysticfall

+0

Я только что прочитал часть, которая вызывает проблему с комментарием: * https://github.com/greencatsoft/scalajs-angular/blob/master/src/main/scala/com/greencatsoft/angularjs/internal/ServiceProxy .scala # L29 Он должен читать список переменных с аннотацией @inject от данного типа, но он не работает должным образом. Если вам нужен рабочий пример, который может воспроизвести проблему, вы можете запустить 'sbt localPublish' в указанном выше проекте и попытаться построить следующий проект: * https://github.com/greencatsoft/scalajs-angular -todomvc Спасибо! – mysticfall

ответ

2

Если вы не аннотируете аннотацию одной из аннотаций scala.annotation.meta, аннотация будет помещена в подстилающие поля vals/vars. Чтобы заполучить их, сделайте val fields = tag.tpe.decls.collect{ case s: TermSymbol if !s.isMethod => s }, и тогда все должно быть в порядке.

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