2016-12-27 70 views
0

我正在将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 [email protected](modifiers, fname, tparams, paramss, Some(returnType), body) => 
      println(body.syntax) 
     } 
     case _ => 
    } 
    defn 
    } 
} 

ExportFunctions extends StaticAnnotation执行功能的身体被表示为脱糖树:x.max(y)

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

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

回答

0

从3.0.0-M8开始,scala.meta paradise宏注释被实现为从scala反射树到scala.meta树的树转换。这种方法不可能获得诸如格式化或注释这样的琐事,所以对你的问题的快速回答是:不,而不是宏注释。

但是,scala.meta拥有一流的API支持,例如格式和注释等详细信息。根据您的应用程序,您可能不需要宏注释,您可以直接使用scala.meta parser作为库。