首页 > 解决方案 > 从具有隐含节点和无序子节点的 ASTNode 创建 PsiElement

问题描述

使用 IntelliJ 的插件 SDK 生成PSIElement树的自定义语言插件是否可以?

这些属性中的任何一个是否会使利用语言插件 SDK 功能变得更加困难?


背景:

我正在根据“实现解析器和 PSI ”为 IntelliJ 创建一个自定义语言插件。

文档中图表的底部显示了ASTNodePsiElement之间的关系。

IIUC,首先,词法分析器将文本分割成标记。然后解析器在标记之间删除节点开始和结束标记以指定解析树结构。Intellij 内部将带有标记的令牌流提升到(不是非常抽象的)ASTNode树中。最后,特定语言的插件代码从 AST 构建 PSI 树。

从该图中看起来,Psi 树中的每个节点都与一个ASTElement相关联。

这种关系似乎是双向的PsiElement.getNode()。该图没有显示MyPsiFileMyElementType.FILE ASTNode之间的箭头,但 PsiFile.getNode()表明必须有一个。

由于特定于语言的原因,我现有的解析器生成的树并不明显适合此模型。

有一个“非物理” PSIElement的概念:

/**
 * Checks if an actual source or class file corresponds to the element. Non-physical elements include,
 * for example, PSI elements created for the watch expressions in the debugger.
 * Non-physical elements do not generate tree change events.
 * Also, {@link PsiDocumentManager#getDocument(PsiFile)} returns null for non-physical elements.

但我不清楚这些是否与ASTNode相关联,或者这是否适用于程序文本暗示的节点。

标签: parsingintellij-ideaabstract-syntax-treeintellij-plugin

解决方案


推荐阅读