Scala宏 - 引用类符号“not found:value <class>”时出错

时间:2017-01-05 00:13:46

标签: scala scala-macros

我正在尝试创建一个生成代码的Scala宏:

val x = new com.foo.MyClass()

其中com.foo.MyClass在编译时肯定在类路径上,并且使用宏在项目中运行时。

我正在使用以下c.Tree来生成代码: Apply(Select(New(Ident(TermName("com.foo.MyClass"))), termNames.CONSTRUCTOR), List())

打印showshowRaw命令的输出表明生成了正确的代码,但在{em>宏期间似乎com.foo.MyClass不在类路径上扩展或在编译后立即进行。

我看到在宏的使用点产生了以下错误(宏impl本身是在一个单独的项目中定义的):

[ERROR] /src/main/java/foo/MyWhatever.scala:10: not found: value com.foo.MyClass
[ERROR]     MyMacros.someMacro(someInput)
[ERROR]

为什么它在类路径上找不到这个类,即使它是同一个项目中的Java文件?我试过-Ymacro-debug-verbose并且com.foo.MyClass不在输出中,而是一堆其他的Java&amp; Scala类是。我无法找到宏扩展的类路径上的类的模式。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

好!我设法回答了我自己的问题。事实证明,使用val classSymbol = c.mirror.staticClass("com.foo.MyClass") val newClassTree = q"new ${classSymbol.toType}()" c.Expr { newClassTree } // Success! This compiles and runs 来使用编译时反射来获取类符号,然后使用准引号。

我的解决方案:

closeAccordions