如何操作注释宏中的修饰符
How to manipulate modifiers in annotation macros
如何操作修饰符?
例如,我想在 ClassDef
修饰符中排除 Flaga.CASE
。
但是,以下会导致编译错误。
case q"$mods class $name [..$tp](..$vals) extends ..$exts { ..$defs }" if mods.hasFlag(Flag.CASE) =>
val m = mods - Flag.CASE
q"$m class $name [..$tp](..$vals) { ..$defs }"
错误是
[error] ...: value - is not a member of c.universe.Modifiers
[error] val m = mods - Flag.CASE
[error] ^
[error] one error found
好的,修饰符 api 没有 -
来排除指定的元素(如果存在的话,我希望这个方法像 Set 的 -
一样工作)。
我的问题是,正如我上面提到的,有没有一种方法可以操纵修改器?
尝试
import c.universe._
implicit class ModifiersOps(left: Modifiers) {
def & (right: FlagSet): Modifiers = left match {
case Modifiers(flags, privateWithin, annots) => Modifiers(flags & right, privateWithin, annots)
}
}
implicit class FlagSetOps(left: FlagSet) {
def & (right: FlagSet): FlagSet = (left.asInstanceOf[Long] & right.asInstanceOf[Long]).asInstanceOf[FlagSet]
def unary_~ : FlagSet = (~ left.asInstanceOf[Long]).asInstanceOf[FlagSet]
}
annottees.head match {
case q"${mods: Modifiers} class $name [..$tp](..$vals) extends ..$exts { ..$defs }" if mods.hasFlag(Flag.CASE) =>
val m = mods & ~Flag.CASE
q"$m class $name [..$tp](..$vals) { ..$defs }"
}
如何操作修饰符?
例如,我想在 ClassDef
修饰符中排除 Flaga.CASE
。
但是,以下会导致编译错误。
case q"$mods class $name [..$tp](..$vals) extends ..$exts { ..$defs }" if mods.hasFlag(Flag.CASE) =>
val m = mods - Flag.CASE
q"$m class $name [..$tp](..$vals) { ..$defs }"
错误是
[error] ...: value - is not a member of c.universe.Modifiers
[error] val m = mods - Flag.CASE
[error] ^
[error] one error found
好的,修饰符 api 没有 -
来排除指定的元素(如果存在的话,我希望这个方法像 Set 的 -
一样工作)。
我的问题是,正如我上面提到的,有没有一种方法可以操纵修改器?
尝试
import c.universe._
implicit class ModifiersOps(left: Modifiers) {
def & (right: FlagSet): Modifiers = left match {
case Modifiers(flags, privateWithin, annots) => Modifiers(flags & right, privateWithin, annots)
}
}
implicit class FlagSetOps(left: FlagSet) {
def & (right: FlagSet): FlagSet = (left.asInstanceOf[Long] & right.asInstanceOf[Long]).asInstanceOf[FlagSet]
def unary_~ : FlagSet = (~ left.asInstanceOf[Long]).asInstanceOf[FlagSet]
}
annottees.head match {
case q"${mods: Modifiers} class $name [..$tp](..$vals) extends ..$exts { ..$defs }" if mods.hasFlag(Flag.CASE) =>
val m = mods & ~Flag.CASE
q"$m class $name [..$tp](..$vals) { ..$defs }"
}