0

我正在将 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)。

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

4

1 回答 1

0

从 3.0.0-M8 开始,scala.meta 宏注释被实现为从 scala-reflect 树到 scala.meta 树的树转换。这种方法无法获得诸如格式化或注释之类的琐事,因此对您的问题的快速回答是:不,不是使用宏注释。

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

于 2017-04-14T23:22:21.230 回答