Intellij插件:PsiFile.findElementAt()返回的元素提供了极少的语言语法信息。

问题描述 投票:0回答:1

我试图创建一个Intellij插件,它与我最近创建的VSCode扩展做同样的事情。Ligatures Limited它的设计是为了防止Fira Code等字体的字体编码连接符被断章取义,这样它们就可以用于运算符和标点符号,但不会出现在注释和字符串中。

我试着按照这个例子中的代码来做。https:/github.comJetBrainsintellij-sdk-docstreemastercode_samplespsi_demo。

...但当我创建这样的代码时

    public void actionPerformed(AnActionEvent anActionEvent) {
        Editor editor = anActionEvent.getData(CommonDataKeys.EDITOR);
        PsiFile psiFile = anActionEvent.getData(CommonDataKeys.PSI_FILE);
        if (editor == null || psiFile == null) return;
        int offset = editor.getCaretModel().getOffset();

        final StringBuilder infoBuilder = new StringBuilder();
        PsiElement element = psiFile.findElementAt(offset);

...对于三种不同的文件类型,我发现只有JSON文件(JSON、JavaScript和TypeScript文件)被语言识别,并且在我的扩展允许的范围内被标记化。语法着色和其他语言特定的支持显然在某种程度上发挥作用,但不是我的扩展似乎能够访问的方式。

psiFile.languageJSON JSON的,但它只是 TEXT 的JavaScript,以及 textmate 的TypeScript。

我可以看到JSON的所有不同的标记类型(JsonObject、JsonStringLiteral、JsonProperty等),但是JavaScript文件是以一个大的TEXT标记回来的,里面有JavaScript文件的所有文本,而TypeScript只产生了 PsiElement(empty token)

这是我现在的 plugin.xml 文件。

<idea-plugin>
  <id>com.shetline.ligatures-limited</id>
  <name>Ligatures Limited</name>
  <vendor email="[email protected]" url="http://github.com/kshetline/ligatures-limited-idea">Kerry Shetline</vendor>

  <description><![CDATA[
    Code ligatures <i>only where you want them</i>, not where you don't
    ]]></description>

  <depends>com.intellij.modules.lang</depends>
  <depends>com.intellij.modules.platform</depends>
  <depends optional="true">JavaScript</depends>

  <applicationListeners>
    <listener class="com.shetline.lligatures.LigaturesLimited" topic="com.intellij.ide.AppLifecycleListener"/>
  </applicationListeners>

  <extensions defaultExtensionNs="com.intellij">
    <applicationService serviceImplementation="com.shetline.lligatures.LigaturesLimited"/>
    <highlightVisitor implementation="com.shetline.lligatures.LigaturesLimited"/>
    <highlightingPassFactory implementation="com.shetline.lligatures.LigaturesLimited"/>
  </extensions>

  <actions>
  </actions>
</idea-plugin>

我有点担心我可能需要为每一种要解析的语言明确添加依赖关系。但话说回来,添加 <depends optional="true">JavaScript</depends> 并没有帮助我进一步解析JavaScript,所以也许这无论如何也帮不上忙。

也许是时间上的问题,就像我从 highlightVisitor 在文件被解析之前?

kotlin intellij-plugin intellij-platform-psi fira-code
1个回答
1
投票

我被一些创建Intellij插件项目的向导自动完成的事情所困扰。

我的默认 build.gradle.kts 文件中包含了这个。

intellij {
  version = "2020.1.1"
}

我不知道虽然我运行的是IDEA的终极版 但这个配置会导致我的插件在社区版的包装器里启动 当然这个包装器对我要处理的所有语言都不了解

改成这样:

intellij {
  version = "IU-2019.3.3"
}

...解决了这个问题 理想情况下,我希望找到一种方法来编程使用当前版本的开发环境,但这绝对解决了我的本质问题。

© www.soinside.com 2019 - 2024. All rights reserved.