Получение файлов путей к ресурсам из контекста макроса scala

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

  def example_impl(c: Context): c.Expr[Unit] = {
    import c.universe._
    //instead of  
    // val r = this.getClass().getResource("/file.txt")

    val r = c.somthing.getResource("/file.txt")
    //...
  }

Это может быть невозможно. Но если это так, я хотел бы знать, как это сделать.


person user833970    schedule 11.12.2013    source источник


Ответы (2)


Давайте сначала рассмотрим, что такое «ресурс». Ресурс — это файл, который можно найти, начиная с каталогов в пути к классам. Обратите внимание, что для этой цели файл jar является каталогом, поскольку он хранит файловую систему zip. Путь к классам — это информация о среде, доступная при запуске Java.

И есть фундаментальная проблема: компилятор Scala не знает, где находятся эти ресурсы! Он получает исходные файлы для компиляции, возможно, каталог назначения, и у него есть собственные пути к классам, но они связаны с запуском scalac, а не с компилируемым scalac кодом.

Ресурсы "генерирует" не компилятор - ни scalac, ни javac. Это другие инструменты, такие как jar (инструмент командной строки), и обычно вызываются другими инструментами, такими как системы сборки (ant, maven, sbt).

Таким образом, нет никакой информации о том, где можно найти эти ресурсы — в любом случае они обычно находятся в каталогах, отдельных от исходного кода. Вы можете использовать обычную поддержку файлового ввода-вывода Scala для перемещения по каталогам и тому подобному, но во время компиляции нет информации об «источнике ресурсов».

person Daniel C. Sobral    schedule 11.12.2013
comment
Это очень плохо, но я как бы подозревал, что это так. - person user833970; 11.12.2013
comment
Мне нужно пересмотреть это снова. Я считаю, что это можно сделать через Context.classpath - person user833970; 24.12.2013

В конце концов я заставил это работать с Context.classpath.

https://github.com/marklemay/sacala-validation-macros/blob/master/macroHost2/src/main/scala/macroHost/Macros.scala

Однако я тестировал его только в IDE scala (eclipse). Его нужно было протестировать в sbt, intelij, maven и scalac, прежде чем я был уверен в этом.

person user833970    schedule 26.04.2015