IntelliJ插件开发:如何使类扩展另一个类

时间:2018-01-31 22:39:55

标签: java intellij-idea jetbrains-ide intellij-plugin

我正在实现一个插件,我需要为现有类添加extends子句。

我有PsiClass个实例代表说MyClass

有一个API允许获取MyClass扩展的所有类:

PsiReferenceList extendsList = psiClass.getExtendsList()

理论上我可以添加一些东西,这样可以。

问题: PsiReferenceList.add()消耗PsiElement而且我不知道如何创建PsiElement具有I类完全限定名称的对象想用。

更具体地说,如何将字符串com.mycompany.MyAbstractClass转换为代表此类的PsiElement

更新 我设法使用以下逻辑实现结果:

PsiElementFactory factory = JavaPsiFacade.getInstance(project).getElementFactory();
PsiReferenceList extendsList = aClass.getExtendsList();
PsiShortNamesCache instance = PsiShortNamesCache.getInstance(project);
PsiClass[] abstractClasses = instance.getClassesByName(
        "MyAbstractClass", 
        GlobalSearchScope.allScope(project)
);
PsiJavaCodeReferenceElement referenceElement = factory
        .createClassReferenceElement(abstractClasses[0]);
extendsList.add(referenceElement);

它有效,但我想应该有更优化的方式。

1 个答案:

答案 0 :(得分:1)

您可以制作一个String,这是您要生成的代码,例如

String code = "class A extends B { }"

然后,使用此代码将文本转换为PsiElement

PsiElement fromText(String code, Project project) {
  return PsiFileFactory
        .getInstance(project)
        .createFileFromText(JavaLanguage.INSTANCE, code)
        .getFirstChild()
}

您将获得相应的PsiElement

然后,myClass.replace(fromText(code))

顺便说一句,你也可以做classNamePsiElement.addAfter(fromText("extends Xxx"))这被认为更有效率。