我正在实现一个插件,我需要为现有类添加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);
它有效,但我想应该有更优化的方式。
答案 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"))
这被认为更有效率。