5

我有一个链接到 Java 资源的自定义 XML 格式。为简单起见,假设我的 XML 文件如下所示:

<root>
  <java-class>my.fully.qualified.class.name</java-class>
</root>

最终我的参考文献会稍微复杂一些。它不会直接包含完全限定的类名,我需要一些逻辑来解析正确的类,但我想在这里尽可能简单地保持示例。

现在我希望可以 Strg+Click 元素的文本并希望 IntelliJ 将我带到 .java 文件,就像在 Spring-XML 文件中一样。在IDEA 插件开发常见问题解答中,有一个名为“如何在 XML 文件中添加对 Java 元素的自定义引用? ”的链接,这听起来很像我所需要的。不幸的是,它链接到一个讨论,其中有人或多或少地完成了这样的事情,有一些小问题。尽管如此,我明白我可能需要编写接口 com.intellij.psi.PsiReference 的实现。不幸的是,谷歌搜索“PsiReference”和“IntelliJ”或“IDEA”并没有提供任何关于如何使用它的教程,但我找到了XmlValueReference类这听起来很有用。再次谷歌搜索“XmlValueReference”并没有发现任何关于如何使用该类的有用信息。至少PSI Cookbook告诉我,我可以使用JavaPsiFacade.findClass(). 我会感谢任何指导正确用法的教程、提示等。

上面链接的讨论提到,一旦我最终设法实现它,我需要调用registry.registerReferenceProvider(XmlTag.class, provider)以注册我的提供者,但是“注册表”属于哪种类型,我从哪里得到它?

4

1 回答 1

10

首先,这是几天前出现的一个很好的教程,它解释了 IntelliJ 插件开发的基础知识(你应该看看参考贡献者部分)。

您可能必须定义自己的PsiReferenceContributor,这将在您的引用中plugin.xml像这样:

<psi.referenceContributor implementation="com.yourplugin.YourReferenceContributor"/>

在您的参考贡献者中,有一种方法registerReferenceProviders(PsiReferenceRegistrar)可以让您调用registry.registerReferenceProvider(XmlTag.class, provider).

最后,在您的实例中PsiReferenceProvider,您必须测试标签名称以过滤掉不包含类引用的标签,然后使用JavaPsiFacade.findClass().

根据我的经验,获得有关 IntelliJ 插件开发帮助的最佳地点是JetBrains 的论坛。

于 2013-01-17T10:25:35.420 回答