在scala宏注释中获取另一个类的所有注释

在scala宏注释中获取另一个类的所有注释,scala,reflection,scala-macros,Scala,Reflection,Scala Macros,我正在尝试为case类编写注释,以便动态添加获取MongoDB文档实例的方法。除了嵌套case类的情况外,所有操作都正常: @MongoEntity final case class Person(name: String, info: DetailedInfo) @MongoEntity final case class DetailedInfo(info: String) 原因是annotations方法总是返回空集合。在下面的代码段中,访问器方法使用c.typecheck函数返回类型

我正在尝试为case类编写注释,以便动态添加获取MongoDB文档实例的方法。除了嵌套case类的情况外,所有操作都正常:

@MongoEntity
final case class Person(name: String, info: DetailedInfo)

@MongoEntity
final case class DetailedInfo(info: String)
原因是annotations方法总是返回空集合。在下面的代码段中,访问器方法使用c.typecheck函数返回类型

def generateMethods(classType: TypeName, fields: List[ValDef]) = {
  val typedFields = accessors(fields)

  q"""
    ${Modifiers(Flag.IMPLICIT)} def toDoc(model: $classType): org.mongodb.scala.Document = {
      org.mongodb.scala.Document(
        ..${typedFields.map {
          // annotations is always empty =(
          case accessor if accessor.symbol.asType.annotations.exists(_.eq(MongoEntity)) => q"""${accessor.name.toString} -> ${accessor.name}.toDoc(model.${accessor.name})"""
          case accessor if accessor.paramType <:< typeOf[TraversableLike[_, _]] => q"""${accessor.name.toString} -> model.${accessor.name}.toList"""
          case accessor => q"""${accessor.name.toString} -> model.${accessor.name}"""
        }}
      )
    }
   """
}
def generateMethods(类类型:TypeName,字段:List[ValDef])={
val typedFields=访问器(字段)
q”“”
${Modifiers(Flag.IMPLICIT)}def toDoc(model:$classType):org.mongodb.scala.Document={
org.mongodb.scala.Document(
..${typedFields.map{
//注释总是空的=(
如果accessor.symbol.asType.annotations.exists(uq.eq(MongoEntity))=>q“${accessor.name.toString}->${accessor.name}.toDoc(model.${accessor.name})”
如果accessor.paramType q“”“${accessor.name.toString}->model.${accessor.name}.toList”“”
case accessor=>q“”“${accessor.name.toString}->model.${accessor.name}”
}}
)
}
"""
}

如何获取另一个case类的注释列表?

目前,我发现的最简单的样板解决方案是为类型引入新的标记注释,这些类型应映射到文档。可以通过修改器在ValDef类上使用模式匹配来获取此注释。