Scala чтение аннотаций метода из другого проекта - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть конфиг sbt с scala play! сервер, scalajs клиент и общий проект, который содержит классы, которые передаются между ними.

Я хочу, чтобы мой клиент имел строгую информацию о типах для вызовов API сервера, поэтому я пишу задача, которая для каждого маршрута в файле routes создает соответствующий метод в клиенте. У меня есть прототип, который способен анализировать почти всю необходимую мне информацию из файла routes. Единственное, что я не могу получить, это возвращаемые типы.

Вот что у меня есть до сих пор (я понимаю, что это не обрабатывает все, но работает для всех базовых c случаев, с которыми я работаю прямо сейчас):

case class RouteDef(
        method: String,
        url: String,
        pack: String,
        controller: String,
        fn: String,
        args: Option[Array[String]],
        retType: String = "Array[Byte]",
        retFormat: String = "application/json"
      ) {
        def interpolatedUrl: String = {
          ":(?<symbol>[^/]+)".r.replaceAllIn(url, (matc) => "\\${${symbol}}")
        }

        override def toString: String = {
          s"""  import play.api.libs.json.{Json,Reads}
  import org.scalajs.dom.ext.Ajax.InputData
  import scala.concurrent.Future
  import scala.concurrent.ExecutionContext.Implicits.global
  import scala.util.Try
  import org.scalajs.dom.XMLHttpRequest
  import org.scalajs.dom.ext.Ajax

  def ${fn}(${args match {
    case Some(a) => a.mkString(", ") + ","
    case None => ""
  }} timeout: Int = 0, headers: Map[String, String] = Map.empty, withCredentials: Boolean = false) : Future[${retType}] = {
    Ajax(\"${method}\", \"${interpolatedUrl}\", null, timeout, headers, withCredentials, \"${retFormat}\").transform(
      (x: Try[XMLHttpRequest]) => Try(Json.parse(x.get.responseText).as[${retType}])
    )
  }
"""
        }
      }

Я думал о добавлении аннотации к каждому из моих вызовов методов, но тогда у меня нет хорошего способа разобрать их. Я попытался использовать scalac -Xshow-class, но он не отображает типы или аннотации.

Я думал о попытке проанализировать файл класса вручную, но, похоже, я столкнулся с множеством угловых случаев, которые приводили бы к это сильная головная боль.

Есть ли хороший способ перевести полный путь к определению метода, чтобы получить аннотации этого метода?

...