Макрос Scala расширяется до опции компилятора - PullRequest
1 голос
/ 12 марта 2019

Моя первоначальная задача - установить какой-либо объект, содержащий дистрибутивную версию моего приложения, установленного в данный момент. Это необходимо для возможности запрашивать текущую версию через http-конечную точку (разные клиенты используют разные версии).

Так что я подумал, что это идеальное задание для макроса. Проблема в том, что моя система сборки maven, и я подумал о том, чтобы передать номер версии (доступный в свойствах maven в pom.xml в качестве опции компиляции для последующего извлечения ее из макроса).

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

Погуглив проблему, не дало никакого разумного результата. Может кто-нибудь дать совет, если это вообще возможно?

1 Ответ

3 голосов
/ 12 марта 2019

Это оказалось очень просто.Существует определенная опция компилятора

-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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...