Во время компиляции, как получить имя текущего исходного файла (где написано код) в scala 2.11?Как найти имя прилагаемого исходного файла в Scala 2.11
ответ
В РЕПЛ, название консоль, но это показывает, что позиция знает его источник.
scala> import scala.language.experimental.macros
import scala.language.experimental.macros
scala> import scala.reflect.macros.whitebox.Context
import scala.reflect.macros.whitebox.Context
scala> def f(c: Context): c.Tree = { import c._,universe._ ; Literal(Constant(c.enclosingPosition.source.file.name)) }
f: (c: scala.reflect.macros.whitebox.Context)c.Tree
scala> def g: String = macro f
defined term macro g: String
scala> g
res0: String = <console>
'c.macroApplication.pos.source.file.name' –
Вот любопытный Hacky так, что на самом деле делает трюк:
val srcFile = new Exception().getStackTrace.head.getFileName
println(srcFile)
Источник: How do I get the current script or class name in Scala?
+1 для прагматического решения. Можно ли полагаться на эту информацию? - Я имею в виду, что, если вы отключите отладочную информацию во время компиляции? – Madoc
Или, вы можете использовать @ литий-Haoyi отличного sourcecode macro library
def foo(arg: String)(implicit file: sourcecode.File) = {
println(s"this file is: '${file.getAbsolutePath}'")
}
foo("hello") // "this file is '/path/to/file'"
Кроме того, многие другие лакомства, как номер строки, имена переменных и т.д.
Зачем вам это нужно? Скажем, у вас есть макрос, который будет вставлять эту строку туда, где вы хотите, она будет в файле .class. Оценивать имя один раз на sturtup в Синглтон не убийца производительности. –
Несомненно, но поскольку эта информация явно доступна компилятору, и она является постоянной, кажется более «правильным» получить ее с помощью макроса. По-прежнему можно использовать это: http://stackoverflow.com/a/21893197/1670894, но, по-видимому, оно устарело с помощью scala 2.11. –
Вам нужен объект класса с именем 'CompilationUnit'. Я использовал его в плагинах компилятора, но не помню, как его получить, или даже если можно получить его из макроса. (возможно == легко. Вы можете отнести объекты в их внутреннее представление компилятора, очень раздражающую задачу, которая заставила отказаться от написания нескольких интересных макросов). – pedrofurla