Макросы Scala: Как я могу получить список объектов в данном пакете, которые наследуют некоторые черты? - PullRequest
0 голосов
/ 26 января 2019

У меня есть пакет foo.bar, в котором определена черта Parent и определена серия объектов Child1, Child2, Child3.Я хотел бы получить List[Parent], содержащий все дочерние объекты, определенные в foo.bar.Как я могу написать такой макрос?

Сейчас у меня есть следующее:

  def myMacro(c: blackbox.Context): c.Expr[Set[RuleGroup]] = {
    val parentSymbol = c.mirror.staticClass("foo.bar.Parent")
    c.mirror.staticPackage("foo.bar").info.members
      // get all objects
      .filter { sym =>
      // remove $ objects
      sym.isModule && sym.asModule.moduleClass.asClass.baseClasses.contains(parentSymbol)
    }.map { ??? /* retrieve? */ }
    ???
  }

1 Ответ

0 голосов
/ 26 января 2019

Если trait не sealed, вы не можете этого сделать. По сути, если trait не равно sealed, это означает, что новые подклассы могут быть добавлены позже в другой единице компиляции.

Если trait равно sealed, то вы можете использовать knownDirectSubclasses из ClassSymbolApi , но остерегайтесь возможных проблем в зависимости от порядка, таких как , и это в цирке

...