我试图编写一个隐式def宏来捕获调用语句(最好没有别的)作为字符串,希望只需将所需的输出对象作为隐式参数即可使用。但是我在使用多行语句时遇到了一些麻烦。
例如:
case class HowWasICalled(statement:String, lineNumber:Int)
object HowWasICalled {
implicit def generate: HowWasICalled = macro macro_impl
}
def callMe(something: Any)(implicit context: HowWasICalled)
// macro: c is the blackbox Context
def macro_impl(c: blackbox.Context): c.Expr[HowWasICalled] = { ... }
第一次尝试在宏中实现一个方法,该方法将调用语句作为字符串返回:
def makeString:String = show(c.macroApplication)
但是,这只是返回" HowWasICalled.generate"。我实际上想要调用callMe的语句。
我希望以下内容能够奏效,但事实并非如此。 -Yrangepos编译器标志似乎不会导致def宏中的范围位置? :(
def makeString:String = {
if (c.enclosingPosition.isRange) {
new String(c.enclosingPosition.source.content.slice(
c.enclosingPosition.start,
c.enclosingPosition.end
))
}
}
我接近任何工作实现的最接近的并不是完全捕获语句或整个语句,但至少我得到了调用callMe的源代码行。 def makeString:String = { val lineNumber = c.enclosingPosition.line val lineIndex = lineNumber-1 c.enclosingPosition.source.lineToString(lineIndex) }
如何改进宏以处理以下情况?理想情况下,在给定以下输入
的情况下,应生成HowIWasCalled("callMe( 1 + 2 )", 123)
之类的内容
0; 0; 0; val x = callMe(1 +
2)