如何在宏观注释中保存糖,格式和空格(Inline-Meta)



我将Scala函数导出到外部格式。为此,我使用scala.metaStaticAnnotation。类似:

@ExportFunctions
object MyFunctions {
  def max(x: Int, y: Int): Int = x max y
}
class ExportFunctions extends StaticAnnotation {
  inline def apply(defn: Any): Any = meta {
    defn match {
      case q"object $name extends { ..$earlydefns } with ..$parents { ..$stats }" =>
        stats.flatMap{
          case defn@Defn.Def(modifiers, fname, tparams, paramss, Some(returnType), body) =>
            println(body.syntax)
        }
      case _ =>
    }
    defn
  }
}

ExportFunctions extends StaticAnnotation的实现中,功能的正文表示为删除树:x.max(y)

但是,出于文档目的,拥有实际的源代码会更好。或至少糖(x max y)。

有没有办法保留原始格式/糖?

从3.0.0-m8开始,Scala.Meta Paradise宏观注释将作为从Scala-Reflect reflect reflect树到Scala.Meta树的树转换。这种方法无法获得格式或评论之类的琐事,因此对您的问题的快速回答是:不,不使用宏观注释。

但是,scala.meta具有一流的API,并提供了诸如格式和评论之类的详细信息。根据您的应用程序,您可能不需要宏观注释,可以将Scala.Meta Parser直接用作库。

最新更新