0

私はScala関数を外部形式にエクスポートしています。この目的のために、私はscala.metaStaticAnnotationを使用します。ような何か:x.max(y)ExportFunctions extends 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 [email protected](modifiers, fname, tparams, paramss, Some(returnType), body) => 
      println(body.syntax) 
     } 
     case _ => 
    } 
    defn 
    } 
} 

は、機能の本体は、脱糖ツリーとして表現されます。

しかし、ドキュメンテーションの目的で、実際のソースコードを作成する方がはるかに良いでしょう。または少なくとも砂糖(x max y)。

オリジナルの書式/砂糖を保存する方法はありますか?

答えて

0

3.0.0-M8から、scala.meta paradiseマクロ注釈は、scala-reflectツリーからscala.metaツリーへのツリー変換として実装されています。このアプローチでは、書式やコメントなどのトリビアを得ることはできません。質問に対する素早い回答は、マクロ注釈ではなく、いいえです。

しかし、scala.metaには、フォーマットやコメントなどの詳細情報をサポートするAPIがあります。アプリケーションによっては、マクロ注釈が必要ない場合があります。scala.meta parserを直接ライブラリとして使用できます。

関連する問題