在使用隐式def调用的scala宏中,如何将调用者的源语句作为字符串获取到隐式def?

时间:2016-12-19 10:38:09

标签: scala macros

我试图编写一个隐式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)

0 个答案:

没有答案