如何从宏提供代码完成信息?

时间:2014-05-14 12:20:53

标签: scala reflection macros code-completion content-assist

我正在为扩展scala.Dynamic的类创建一些宏。这些宏看起来像:

class MyProxy extends scala.Dynamic {
  final def selectDynamic(field: String): MyProxy = macro ...
  final def updateDynamic(field: String)(value: Any): Unit = macro ...
}

这些宏工作正常。但是MyProxy只允许一组有限的成员访问,我希望这些成员列在Scala IDE的内容辅助和REPL控制台的Tab键中。

因为MyProxy实例本身是由宏创建的,我想知道是否有任何属性如setCodeCompletionType可以从创建MyProxy的宏中设置,帮助REPL和Scala IDE的代码完成(并且不影响生成的Java字节代码)。然后我会有一个像这样的宏:

def newMyProxyInstanceImpl(c: Context)(...): c.Expr[MyProxy] = {
  import c.universe._
  val tree: Tree = ...
  val codeCompletionHint: Type = RefinedType(...)
  tree.setCodeCompletionType(codeCompletionHint)
  c.Expr(tree)
}

如何破解Scala编译器以使此方法有效?

0 个答案:

没有答案