如何让IntelliJ IDEA识别由宏创建的代码?

39

背景

我有一个由sbt管理的Scala项目,使用了通常的sbt项目布局来处理具有宏的Scala项目,即包含宏的子项目和作为实际应用程序并依赖于宏子项目的主项目。这些宏是宏注解,本质上为常规类生成伴随对象。生成的伴随对象声明了apply/unapply等成员。

我使用sbt-idea插件生成了相应的IntelliJ IDEA项目,并使用IDEA的sbt-plugin中的sbt控制台来编译和运行Scala应用程序。

一切都还好,只是生成的伴随对象和更重要的是它们的成员,例如apply/unapply,在IDEA中无法识别。因此,我在任何使用apply方法的地方都会看到虚线。

我的设置是Windows 7 x64上带有SBT 1.5.1和Scala 0.28.363插件的IntelliJ IDEA CE 133.471。

问题

如何使IntelliJ IDEA识别由Scala宏(确切地说是宏注解)生成的代码(类、对象、方法等)?

其他IDE,如Eclipse,在这种设置中是否工作更好?

相关

这个问题(较少详细)基本上问了同样的问题,但还没有得到回答(2014年2月26日)。

根据JetBrains开发人员的说法,我请求的功能在他们的长期待办事项清单上,但不会很快实现(2014年3月5日)。


为什么要点踩?请解释一下,这样我才能改进这个问题。 - Malte Schwerhoff
我已经点赞了这个问题,因为我也看不出它为什么应该被踩。 - Software Engineer
除了代码补全之外,我想在Intellij中调试由Scala宏生成的合成代码。 - Ben Hutchison
这个没有插件吗? - Dr.Knowitall
2个回答

7

最新的Scala插件版本提供了一个API,可以用来编写你自己的插件来支持你的宏:http://blog.jetbrains.com/scala/2015/10/14/intellij-api-to-build-scala-macros-support/

Now, everyone can use this API to make their macros more friendly to their favorite IDE. To do that, you have to implement SyntheticMembersInjector, and register it in the plugin.xml file:

<extensions defaultExtensionNs="org.intellij.scala">
  <syntheticMemberInjector implementation="org.jetbrains.example.injector.Injector"/>
</extensions>

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接