宏注释和类型参数

时间:2014-07-07 02:47:18

标签: scala scala-macros

我不确定它是否与Type Parameters on Scala Macro Annotations重复。

我正在尝试在宏注释上获取类型参数:

class builder extends StaticAnnotation {
  def macroTransform(annottees: Any*) = macro builderMacro.impl
}
//....
val q"new $_[$tpt]().macroTransform(..$_)" = c.macroApplication
val tpe = c.typecheck(tpt).tpe
// also tried
// val tpe = c.typecheck(q"None.asInstanceOf[$tpt]").tpe

使用宏的代码:

object Test2 {
  trait TestBuilders

  @builder[TestBuilders]
  case class TestClass(x: Int, opt1: Option[String], opt2: Option[String])  {
    val opts = (opt1, opt2)
  }
}

我得到的例外:

[error] scala.reflect.macros.TypecheckException: not found: type TestBuilders
[error]         at scala.reflect.macros.contexts.Typers$$anonfun$typecheck$2$$anonfun$apply$1.apply(Typers.scala:34)
[error]         at scala.reflect.macros.contexts.Typers$$anonfun$typecheck$2$$anonfun$apply$1.apply(Typers.scala:28)
[error]         at scala.tools.nsc.typechecker.Contexts$Context.withMode(Contexts.scala:374)
[error]         at scala.reflect.macros.contexts.Typers$$anonfun$3.apply(Typers.scala:24)
[error]         at scala.reflect.macros.contexts.Typers$$anonfun$3.apply(Typers.scala:24)
[error]         at scala.reflect.macros.contexts.Typers$$anonfun$withContext$1$1.apply(Typers.scala:25)
[error]         at scala.reflect.macros.contexts.Typers$$anonfun$withContext$1$1.apply(Typers.scala:25)
[error]         at scala.tools.nsc.typechecker.Contexts$Context.withMode(Contexts.scala:374)
[error]         at scala.reflect.macros.contexts.Typers$$anonfun$1.apply(Typers.scala:23)
[error]         at scala.reflect.macros.contexts.Typers$$anonfun$1.apply(Typers.scala:23)
[error]         at scala.reflect.macros.contexts.Typers$class.withContext$1(Typers.scala:25)
[error]         at scala.reflect.macros.contexts.Typers$$anonfun$typecheck$2.apply(Typers.scala:28)
[error]         at scala.reflect.macros.contexts.Typers$$anonfun$typecheck$2.apply(Typers.scala:28)
[error]         at scala.reflect.internal.Trees$class.wrappingIntoTerm(Trees.scala:1691)
[error]         at scala.reflect.internal.SymbolTable.wrappingIntoTerm(SymbolTable.scala:16)
[error]         at scala.reflect.macros.contexts.Typers$class.withWrapping$1(Typers.scala:26)
[error]         at scala.reflect.macros.contexts.Typers$class.typecheck(Typers.scala:28)
[error]         at scala.reflect.macros.contexts.Context.typecheck(Context.scala:6)
[error]         at scala.reflect.macros.contexts.Context.typecheck(Context.scala:6)
[error]         at builderMacro$.impl(Macros.scala:55)

我做错了什么?

1 个答案:

答案 0 :(得分:3)

这是当前宏观天堂中的一个已知问题:https://github.com/scalamacros/paradise/issues/14。请注意,如果在不同的范围内声明TestBuilders,则一切都应该解决。