Получить имя файла текущего файла в scala

Есть ли способ имя файла текущего файла (когда код написан) в scala?

Как мой класс находится в файле, например com/mysite/app/myclass.scala, и я хочу вызвать метод, который будет возвращать "myclass.scala" (или полный путь...)

Спасибо!

1 ответ

Это может быть достигнуто с помощью Scala макросов, экспериментальной языковой функции, доступной из версии 2.10.

Макросы позволяют взаимодействовать со зданием AST во время фазы синтаксического анализа исходного кода и изменять деревья AST до фактического компиляция выполнена.

Поскольку информация о контексте компиляции доступна макросу, хотя объект Context, во время фазы синтаксического анализа можно получить имя исходного файла и вернуть его в качестве литерала String, чтобы быть вставлен вместо вызова макроса в AST.

Далее следует рабочий пример возврата имени исходного файла. Пример разделен на два файла:

Исходный файл, в котором определяется и реализуется макрос:

// Contents of: "Macros.scala"
import scala.reflect.macros.Context
import scala.language.experimental.macros
object Macros {
 def sourceFile: String = macro sourceFileImpl
 def sourceFileImpl(c: Context) = {
 import c.universe._
 c.Expr[String](Literal(Constant(c.enclosingUnit.source.path.toString)))
 }
}

Другой исходный файл, в котором используется макрос:

// Contents of: "Main.scala"
object Main extends App {
 val fileName = Macros.sourceFile
 println(fileName)
}

Реализация макроса и код с его использованием должны быть в разных исходных файлах. Возвращаемое имя файла является правильным, то есть имя исходного файла с вызовом макроса.

licensed under cc by-sa 3.0 with attribution.