我正在实现一个插件,其中需要为现有类添加extends
子句。
我有代表PsiClass
的MyClass
实例。
有一个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"))
,它被认为效率更高。