相关疑难解决方法(0)

处理宏注释时无法访问Parent的成员

我有点被以下(宏注释)情况阻止.假设我有一个被调用的注释@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, …

macros code-generation annotations scala companion-object

8
推荐指数
1
解决办法
1250
查看次数

后代类中的宏扩展

我有下一个类结构:

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吗?

scala scala-macros

3
推荐指数
1
解决办法
335
查看次数