我将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
的实现中,函数体被表示为一个desberared树:x.max(y)
。
但是,出于文档目的,拥有实际的源代码会更好。或至少糖(x max y
)。
有没有办法保留原始格式/糖?
答案 0 :(得分:0)
从3.0.0-M8开始,scala.meta天堂宏注释被实现为从scala-reflect树到scala.meta树的树转换。这种方法无法获得格式化或评论等琐事,因此您的问题的快速答案是:不,不是宏注释。
但是,scala.meta有一个api,它支持对格式和注释等细节的一流支持。根据您的应用程序,您可能不需要宏注释,您可以直接使用scala.meta parser作为库。