2

假设我有两个宏注释类,并且在扩展期间定义了它们的字段之后,一个依赖于另一个:

@Annotation case class A(i: Int) @Annotation case class B(a: A)

我需要A先扩展B,但它们的定义顺序并不能保证。

例如,B在不相关的编译单元中将引用作为类型参数引用,例如:

class X{val b = B(A(1))}在一个文件和class Y{Z[B]}另一个文件中,

导致B首先扩展,因此我的编译失败。

在这种情况下,是什么决定了宏展开的顺序?有没有办法强制执行所需的命令?

感谢您的输入,

朱利安

4

1 回答 1

2

typecheck是我的解决方案。

如果类型 A(A 的 tree.tpe)在其宏展开之前用于编译时反射,则可以在偶然发现它时立即展开:

import c.universe._
import Flag._

def expandType(typeTree: Tree) = {
  c.typecheck(q"type T = $typeTree") match {
    case x @ TypeDef(mods, name, tparams, rhs)  => rhs.tpe
  }
}
于 2015-07-10T06:29:19.950 回答