我有点被以下(宏注释)情况阻止.假设我有一个被调用的注释@factory,它旨在为apply相应的伴随对象中的带注释的特征生成一个方法.例如,鉴于trait A:
@factory
trait A {
val a1: Int
}
Run Code Online (Sandbox Code Playgroud)
要生成的预期代码如下:
object A extends Factory[A] {
def apply(_a1: Int) = new A {
val a1 = _a1
}
}
Run Code Online (Sandbox Code Playgroud)
现在假设我们有一个特征B,它继承自A:
@factory
trait B extends A {
val b1: String
}
Run Code Online (Sandbox Code Playgroud)
这应该产生:
object B extends Factory[B] {
def apply(_a1: Int, _b1: String) = new B {
val a1 = _a1
val b1 = _b1
}
}
Run Code Online (Sandbox Code Playgroud)
在后一种情况下,我需要知道存在哪些属性A, …
我有下一个类结构:
trait SomeType
trait Root {
val allMySomeTypes: Seq[SomeType]
}
class Child extends Root {
object MyType1 extends SomeType {...}
object MyType2 extends SomeType {...}
}
Run Code Online (Sandbox Code Playgroud)
我想初始化val allMySomeTypes作为扩展在具体类中定义的SomeType的所有对象的Seq.所以对于Child实例,它将是val allMySomeTypes:Seq [SomeType] = Seq(MyType1,MyType2).
我写了一个宏来查找具有一些基类型的对象:
def getMembersOfCurrentByType_impl[S](c: Context)(implicit ev: c.WeakTypeTag[S]) = {
import c.universe._
val seqApply = Select(reify(Seq).tree, newTermName("apply"))
val objs = c.enclosingClass.symbol.typeSignature.declarations.collect {
case o: ModuleSymbol if o.typeSignature <:< ev.tpe => Ident(o) //Select(c.prefix.tree, o)
}.toList
c.Expr[Seq[S]] {Apply(seqApply, objs)}
}
Run Code Online (Sandbox Code Playgroud)
并绑定到
trait Root {
val allMySomeTypes: Seq[SomeType] = macro getMembersOfCurrentByType_impl[SomeType]
}
Run Code Online (Sandbox Code Playgroud)
但是,显然,由于基本特征的宏扩展,我在Child类中有空序列.我可以在没有在Child类中额外输入而不使用运行时反射的情况下构建实际成员的Seq吗?