2013-12-11 6 views
2

Я хотел бы сделать макрос, который проверяет во время компиляции наличие ресурсов в других проектах. Возможно ли получить эту информацию из контекста?Получение файлов путей пути из контекста макроса 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") 
    //... 
    } 

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

ответ

1

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

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

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

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

+0

Это очень плохо, но я вроде бы подозревал, что это так. – user833970

+0

Мне нужно рассмотреть это снова. Я считаю, что это можно сделать через Context.classpath – user833970

1

В конце концов я получил эту работу с Context.classpath.

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

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