从Scala宏注释中获取参数
发布时间:2020-12-16 08:58:37 所属栏目:安全 来源:网络整理
导读:所以我在函数上有一个注释(DefDef).此注释具有参数. 但是,我对如何从构造函数中获取参数感到困惑. 用法示例: class TestMacro { @Foo(true) def foo(): String = "" foo} 这是注释的代码: class Foo(b: Boolean) extends StaticAnnotation { def macroTran
所以我在函数上有一个注释(DefDef).此注释具有参数.
但是,我对如何从构造函数中获取参数感到困惑. 用法示例: class TestMacro { @Foo(true) def foo(): String = "" foo } 这是注释的代码: class Foo(b: Boolean) extends StaticAnnotation { def macroTransform(annottees: Any*) = macro Foo.impl } object Foo { def impl(c: whitebox.Context)(annottees: c.Tree*): c.Expr[Any] = { import c.universe._ //how do I get value of `b` here??? c.abort(c.enclosingPosition,"message") } } 解决方法
那这个呢:
val b: Boolean = c.prefix.tree match { case q"new Foo($b)" => c.eval[Boolean](c.Expr(b)) } 为了完整起见,这是完整的来源: import scala.reflect.macros.Context import scala.language.experimental.macros import scala.annotation.StaticAnnotation import scala.annotation.compileTimeOnly import scala.reflect.api.Trees import scala.reflect.runtime.universe._ class Foo(b: Boolean) extends StaticAnnotation { def macroTransform(annottees: Any*) :Any = macro FooMacro.impl } object FooMacro { def impl(c: Context)(annottees: c.Expr[Any]*): c.Expr[Any] = { import c.universe._ val b: Boolean = c.prefix.tree match { case q"new Foo($b)" => c.eval[Boolean](c.Expr(b)) } c.abort(c.enclosingPosition,"message") } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |