我需要在给定位置搜索隐式值。我在类中保留了上一个宏调用的位置,就像这样:
class Delayed[+Kind[_[_]]](val sourceFilePath: String, val callSitePoint: Int) {
def find[F[_]]: Kind[F] = macro Impl.find[Kind, F]
}
上一个宏非常简单:
def build[Kind[_[_]]](c: blackbox.Context): c.Expr[Delayed[Kind]] = {
import c.universe._
c.Expr(
q"""
new Delayed(${c.enclosingPosition.point}, ${c.enclosingPosition.source.path})
"""
)
}
有了这个职位,我需要做的就是启动隐式搜索权限?
def find[Kind[_[_]], F[_]](c: blackbox.Context)(implicit kindTag: c.WeakTypeTag[Kind[F]], fTag: c.WeakTypeTag[F[_]]): c.Expr[Kind[F]] = {
import c.universe._
reify {
val self = c.prefix.splice.asInstanceOf[Delayed[Kind]]
val sourceFile = AbstractFile.getFile(self.sourceFilePath)
val batchSourceFile = new BatchSourceFile(sourceFile, sourceFile.toCharArray)
val implicitSearchPosition = new OffsetPosition(batchSourceFile, self.callSitePoint).asInstanceOf[c.Position]
c.Expr[Kind[F]](c.inferImplicitValue(
appliedType(kindTag.tpe.typeConstructor, fTag.tpe.typeConstructor),
pos = implicitSearchPosition
)).splice
}
}
我使用reify / splice调用获得职位,然后申请inferImplicitValue
。但是编译器抱怨隐式值的最后拼接:
the splice cannot be resolved statically,
which means there is a cross-stage evaluation involved
它要求我将编译器jar添加为依赖项,但是这样做只会导致另一个错误:
Macro expansion contains free term variable c defined by find in Delayed.scala
我了解到,从概念上讲,在价值领域中,辩护是存在的。我不明白的是,应在将宏生成的代码写入我的源代码之前解决隐式搜索。我想出的唯一方法就是隐式搜索在宏上下文中起作用。
我哪里错了?我确实了解编译器消息,但是对我来说,在这种特定情况下没有任何意义。也许我不了解inferImplicitValue
的工作原理。
答案 0 :(得分:1)
尝试(12345)
Context#eval(expr)