如何在宏注释(inline-meta)中保留糖,格式和空格?

时间:2016-12-27 19:24:58

标签: scala macros scala-macros scala-macro-paradise scala-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的实现中,函数体被表示为一个desberared树:x.max(y)

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

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

1 个答案:

答案 0 :(得分:0)

从3.0.0-M8开始,scala.meta天堂宏注释被实现为从scala-reflect树到scala.meta树的树转换。这种方法无法获得格式化或评论等琐事,因此您的问题的快速答案是:不,不是宏注释。

但是,scala.meta有一个api,它支持对格式和注释等细节的一流支持。根据您的应用程序,您可能不需要宏注释,您可以直接使用scala.meta parser作为库。