2015-05-18 3 views
4

Во время компиляции, как получить имя текущего исходного файла (где написано код) в scala 2.11?Как найти имя прилагаемого исходного файла в Scala 2.11

+0

Зачем вам это нужно? Скажем, у вас есть макрос, который будет вставлять эту строку туда, где вы хотите, она будет в файле .class. Оценивать имя один раз на sturtup в Синглтон не убийца производительности. –

+0

Несомненно, но поскольку эта информация явно доступна компилятору, и она является постоянной, кажется более «правильным» получить ее с помощью макроса. По-прежнему можно использовать это: http://stackoverflow.com/a/21893197/1670894, но, по-видимому, оно устарело с помощью scala 2.11. –

+0

Вам нужен объект класса с именем 'CompilationUnit'. Я использовал его в плагинах компилятора, но не помню, как его получить, или даже если можно получить его из макроса. (возможно == легко. Вы можете отнести объекты в их внутреннее представление компилятора, очень раздражающую задачу, которая заставила отказаться от написания нескольких интересных макросов). – pedrofurla

ответ

4

В РЕПЛ, название консоль, но это показывает, что позиция знает его источник.

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> 
+2

'c.macroApplication.pos.source.file.name' –

5

Вот любопытный Hacky так, что на самом деле делает трюк:

val srcFile = new Exception().getStackTrace.head.getFileName 
println(srcFile) 

Источник: How do I get the current script or class name in Scala?

+1

+1 для прагматического решения. Можно ли полагаться на эту информацию? - Я имею в виду, что, если вы отключите отладочную информацию во время компиляции? – Madoc

0

Или, вы можете использовать @ литий-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'" 

Кроме того, многие другие лакомства, как номер строки, имена переменных и т.д.

Смежные вопросы