我将Scala函数导出到外部格式。为此,我使用scala.meta
和StaticAnnotation
。类似:
@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直接用作库。