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

我有代表PsiClassMyClass实例。

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

PsiReferenceList extendsList = psiClass.getExtendsList()


从理论上讲,我可以添加一些东西,它将起作用。

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

更具体地说,如何将字符串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);


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

最佳答案

您可以创建一个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")),它被认为效率更高。

10-08 15:52