我正在尝试创建一个 Intellij 插件,它与我最近创建的 VSCode 扩展Ligatures Limited执行相同的操作,该插件旨在防止来自 Fira Code 等字体的字体编码连字脱离上下文呈现,以便它们工作对于诸如运算符和标点符号之类的东西,但不要出现在注释和字符串中。
我尝试遵循此示例中的代码:https ://github.com/JetBrains/intellij-sdk-docs/tree/master/code_samples/psi_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.language
适用JSON
于 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="kerry@shetline.com" 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
在文件被解析之前收到回调一样?