我想知道创建新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);
它实际上似乎有效 - 文本被添加到文档中并创建了一个节点但是当我在编辑器中编辑引号内的文本时 - 会抛出一些例外...
我做错了什么?添加新元素的正确方法是什么?
答案 0 :(得分:2)
PSI很复杂:(。通常的方法是从精心准备的文本(PsiFileFactory#createFileFromText)创建一个完整的文件,从中提取你需要添加到树中的PSI元素,然后调用PsiElement #add / addBefore / addAfter将提取的元素作为参数传递。如果你的PSI元素是AST的包装器(即AstDelegatePsiElement),它的add *方法已经为不抛出的异常做了必要的魔术。
您可以从IDEA CE源学习GrCreateSubclassAction#startTemplate作为示例,并调用它调用的createCodeReferenceElementFromText的实现。