简短的摘要
所以,我试图在我的项目中使用MDX 。这只是 MarkDown 与一些 JSX(包括 ES6 导入)混合在一起。我想使用 IntelliJ 编辑文件并为 Markdown 位和 JSX 位获得正确的语法突出显示。
我想我应该能够为此配置语言注入,但我在尝试前进时有点停滞不前。看起来我需要自己编写 XML,因为我想要的语言语法是 JSX,而 UI 中唯一的目标语言是 xml、js、sql 和其他一些常见的语言。
我试过的
查看Groovy 注入和Java 注入的源代码,我开始拼凑我需要的东西。
我查看了我的一个示例 MDX 文件的 PSI 结构(我已经告诉 IntelliJ 将其视为 Markdown)。我可以看到我的 JSX 标记被注册为 HTML_TAG 元素。
<?xml version="1.0" encoding="UTF-8"?>
<component name="LanguageInjectionConfiguration">
<injection language="JSX" injector-id="markdown">
<display-name>JSX in Markdown</display-name>
<place><![CDATA[psiElement().withElementType(org.intellij.plugins.markdown.lang.MarkdownTokenTypes.HTML_TAG)]]></place>
</injection>
</component>
IntelliJ 未能导入该消息,并显示“没有导入新条目”。然后我查看了一个示例导出,发现我应该使用<LanguageInjectionConfiguration>
标签,所以我尝试了:
<LanguageInjectionConfiguration>
<injection language="JSX" injector-id="markdown" enabled="true">
<display-name>JSX in Markdown</display-name>
<place><![CDATA[psiElement().withElementType(org.intellij.plugins.markdown.lang.MarkdownTokenTypes.HTML_TAG)]]></place>
</injection>
</LanguageInjectionConfiguration>
...但是,我收到了同样的错误。
查看 IntelliJ 日志,它显示此错误:
2018-10-23 12:17:28,680 [3894254] WARN - s.compiler.PatternCompilerImpl - Markdown 中的 JSX:psiElement().withElementType(org.intellij.plugins.markdown.lang.MarkdownTokenTypes.HTML_TAG)
java.lang.IllegalStateException: 33(.): 'org.' 方法名称开始无效,应为“(”
在 com.intellij.patterns.compiler.PatternCompilerImpl.throwError(PatternCompilerImpl.java:293)
...很长很长的堆栈跟踪...
在 java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
MarkdownTokenTypes.HTML_TAG
绝对是方法签名之一IElementType
所必需的。withElementType
结论
我担心我把这件事复杂化了。是否有编写自定义语言注入的好指南?我不清楚place
标签的返回类型应该是什么,也不清楚我是否应该使用模式而不是位置。