我正在尝试创建一个生成代码的Scala宏:
val x = new com.foo.MyClass()
其中com.foo.MyClass
在编译时肯定在类路径上,并且使用宏在项目中运行时。
我正在使用以下c.Tree
来生成代码:
Apply(Select(New(Ident(TermName("com.foo.MyClass"))), termNames.CONSTRUCTOR), List())
打印show
和showRaw
命令的输出表明生成了正确的代码,但在{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& Scala类是。我无法找到宏扩展的类路径上的类的模式。
感谢您的帮助!
答案 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