scala宏:如何读取注释对象
发布时间:2020-12-16 09:57:53 所属栏目:安全 来源:网络整理
导读:我想和 Scala Macros: Checking for a certain annotation做类似的事情 我的注释看起来像: class extract(val name: String) extends StaticAnnotation 而我正在使用它: case class MainClass(@extract("strings") foo: String,bar: Int) 我正在尝试获取fo
我想和
Scala Macros: Checking for a certain annotation做类似的事情
我的注释看起来像: class extract(val name: String) extends StaticAnnotation 而我正在使用它: case class MainClass(@extract("strings") foo: String,bar: Int) 我正在尝试获取foo参数Symbol,因为它有一个@extract注释: val extrList = params.map { param: Symbol => param.annotations.collect { case extr if extr.tpe <:< c.weakTypeOf[extract] => val args = extr.scalaArgs if (args.size != 1) abort("@extract() should have exactly 1 parameter") getExtractValue(args.head) -> param } } getExtractValue方法如下所示: def getExtractValue(tree: Tree): String = ??? 如何获取@extract批注的值名称 更新 我从scalaArgs得到的树似乎太缺乏c.eval() param: Symbol => param.annotations.collect { case ann if ann.tpe <:< c.weakTypeOf[extract] => val args = ann.scalaArgs val arg0 = args.head val name: String = c.eval(c.Expr(arg0)) echo(s"args @extract(name = $name)") name -> param } 给出错误 [error] exception during macro expansion: [error] scala.tools.reflect.ToolBoxError: reflective toolbox has failed: cannot operate on trees that are already typed [error] at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal. verify(ToolBoxFactory.scala:74) 完整的堆栈跟踪指向c.eval(我将c.eval与c.Expr分开) 解决方法
在这种情况下:
def getExtractValue(tree: Tree) = tree match { case Literal(Constant(str: String)) => str } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |