IntelliJ IDEA插件开发:如何修改Psi树?

IntelliJ IDEA plugin development: how to modify the Psi tree?

我想知道 "proper" 创建新 PsiElement 实例并将它们添加到 Psi 树的方法是什么。

我看了 JetBrains 提供的教程 (http://www.jetbrains.org/intellij/sdk/docs/tutorials/custom_language_support/quick_fix.html)。他们在那里使用的方法似乎适合他们介绍的简单属性语言,但我不认为这是使用更复杂语法的方法,我想在其中添加不能出现在 PsiFile 根级别的子 PsiElement。

对我来说最好的是能够将文本片段解析为元素并将其添加到树中。我试着做这样的事情:

myLangTopElement.getNode().addLeaf(MyLangTypes.CHILD_EXPRESSION, "fish = '42'", null);

它实际上似乎有效 - 文本被添加到文档并创建了一个节点但是当我在编辑器中编辑引号内的文本时 - 抛出了一些异常...

我做错了什么?添加新元素的正确方法是什么?

PSI 很复杂 :(。通常的方法是从精心准备的文本 (PsiFileFactory#createFileFromText) 创建整个文件,从中提取需要添加到树中的 PSI 元素,然后调用 PsiElement# add/addBefore/addAfter 将提取的元素作为参数传递。如果您的 PSI 元素是 AST 的包装器(即 AstDelegatePsiElement),它的 add* 方法已经完成了不抛出异常所必需的魔法。

你可以学习IDEA CE源码中的GrCreateSubclassAction#startTemplate作为例子,以及它调用的createCodeReferenceElementFromText的实现。