向 IntelliJ 添加 Markdown JSX 语言注入

Adding Markdown JSX Language Injection to IntelliJ

简短摘要

所以,我正在尝试在我的项目中使用 MDX。它只是混合了一些 JSX(包括 ES6 导入)的 MarkDown。我想使用 IntelliJ 编辑文件并为 Markdown 位和 JSX 位获得正确的语法突出显示。

我想我应该可以为此配置一个 language injection,但我有点停滞不前了。看来我需要自己编写 XML,因为我想要的语言语法是 JSX,而 UI 中唯一的目标语言是 xml、js、sql,以及其他一些常见的。

我试过的

查看 Groovy injections and the Java injections 的来源,我开始拼凑我需要的东西。

looked at the PSI Structure 我的一个示例 MDX 文件(我已经告诉 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 - JSX in Markdown: psiElement().withElementType(org.intellij.plugins.markdown.lang.MarkdownTokenTypes.HTML_TAG)

java.lang.IllegalStateException: 33(.): 'org.' method name start is invalid, '(' expected

at com.intellij.patterns.compiler.PatternCompilerImpl.throwError(PatternCompilerImpl.java:293)

...long, long stack trace...

at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

MarkdownTokenTypes.HTML_TAG 绝对是 one of the withElementType method signatures 所要求的 IElementType

结论

我担心我把这个复杂化了。是否有编写自定义语言注入的良好指南?我不清楚 place 标签的 return 类型应该是什么,我也不清楚我是否应该赞成使用模式而不是位置。

根据对 this issue 的评论,计划推出一个插件,它将在 JetBrains 产品中为 MDX 启用 "basic support":

尚不清楚 "basic MDX support" 的含义,但它不仅仅是语法高亮和单词补全。它将有 "coding assistance",我认为这将是上下文操作、自动导入等。我要求对线程进行澄清,如果我听到更多信息,将更新此答案。