Макросы Scala: генерировать код на основе содержимого файла

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

Как я могу прочитать их при выполнении макроса scala? (Я использую встроенный метод определения StaticAnnotation apply(defn: Any): Any)

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


person Evgeny Nacu    schedule 18.01.2018    source источник
comment
Что вы уже пробовали? Почему бы не использовать генератор источников (SBT)?   -  person cchantep    schedule 18.01.2018
comment
@cchantep Я разрабатываю библиотеку. Поэтому генерация кода должна быть доступна для sbt и maven. Если я правильно понял, включить генератор макросов в maven очень просто — просто включите райский плагин. Я сейчас рассматриваю разные варианты - пытаюсь понять, что лучше   -  person Evgeny Nacu    schedule 19.01.2018
comment
Макрос — это языковая фича, генерация кода — это инструмент разработчика, лучшего нет, все зависит от случая (здесь я не буду использовать макрос)   -  person cchantep    schedule 19.01.2018
comment
да, я вижу разницу ) Пытаюсь понять, что будет лучше для моего случая. В настоящее время кажется, что макрос не будет работать хорошо (плагин paradise является экспериментальным и, похоже, заброшен и не будет доступен в будущих версиях scala) в соответствии с этим обсуждением: contributors.scala-lang.org/t/annotation-macros/1211/34   -  person Evgeny Nacu    schedule 20.01.2018
comment
Что, по вашему мнению, было лучшим в конце? Я рассматриваю что-то подобное прямо сейчас, просмотрел генерацию кода и макросы и еще не уверен, что делать.   -  person Luke Eller    schedule 16.03.2020
comment
@LukeEller Я закончил с генерацией кода   -  person Evgeny Nacu    schedule 17.03.2020


Ответы (1)


директор вашего проекта

val projectDir = System.getProperty("user.dir")

теперь вы можете получить доступ к исходному файлу

val file = new File(s"$projectDir/src/resources/<SOURCES FILE>")

person 余杰水    schedule 19.01.2018
comment
Это не то, что я спросил. Например, у меня есть проект root sbt с некоторыми подпроектами. Классы с аннотациями макросов находятся в подпроекте, но в этом случае user.dir даст мне путь к корневому проекту sbt. поэтому s$projectDir/src/resources/‹SOURCES FILE› не найдет нужный ресурс - person Evgeny Nacu; 19.01.2018
comment
возможно, вы можете использовать c.enclosingPosition.source.path; он вернет текущий путь к файлу :) - person 余杰水; 19.01.2018