gpt4 book ai didi

java - IntelliJ插件开发: how to make class extend another class

转载 作者:行者123 更新时间:2023-11-30 06:19:09 26 4
gpt4 key购买 nike

我正在实现一个插件,需要在其中为现有类添加 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")) ,这被认为更有效。

关于java - IntelliJ插件开发: how to make class extend another class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48552633/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com