【问题标题】:Macro annotations and type parameter宏注解和类型参数
【发布时间】:2014-07-07 19:15:57
【问题描述】:

我不确定它是否与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)

我做错了什么?

【问题讨论】:

  • ok.. 我只能使用 tpt Tree 而没有实际的类型。但我还是不明白为什么我不能在这里输入

标签: scala scala-macros


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多