【问题标题】:Scala macro expand to compiler optionScala 宏扩展为编译器选项
【发布时间】:2019-03-12 01:35:15
【问题描述】:

我最初的任务是让一些对象包含我当前安装的应用程序的分发版本。这对于能够通过 http-endpoint 请求当前运行的版本是必要的(不同的客户端运行不同的版本)。

所以我认为这是宏的完美任务。问题是我的构建系统是 maven,我想传递版本号(可在 pom.xml 的 maven 属性中作为编译选项,以便稍后从宏中检索它)。

object ProjectVersion {
   def applicationVersion(): String = macro getVersion
   def getVersion(c: Context)(): c.Expr[Unit] = {
      //?
   }
}

谷歌搜索这个问题并没有给出任何合理的结果。如果可能的话,有人可以给个建议吗?

【问题讨论】:

    标签: scala macros


    【解决方案1】:

    事实证明这非常简单。有一个具体的compiler option

    -Xmacro-settings OPTION1,OPTION2
    宏的自定义设置。

    因此,如果传递的唯一宏设置是版本号,我们可以添加以下宏实现:

    object Version {
      def versionNumber(): String = macro debug_impl
    
      def versionNumber_impl(c: whitebox.Context)(): c.Expr[String] = {
        import c.universe._
        val paramRepTree = c.Expr[String](Literal(Constant(c.settings.head)))
        reify { paramRepTree.splice }
      }
    }
    

    使用也很简单

    object TestMacro extends App{
      import Version._
      println(versionNumber()) // prints 0.1-SNAPSHOT for my pom.xml
    }
    

    【讨论】:

      猜你喜欢
      • 2019-08-31
      • 1970-01-01
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      • 2017-08-15
      相关资源
      最近更新 更多