【问题标题】:IntelliJ Plugin Development: how to make class extend another classIntelliJ 插件开发:如何使类扩展另一个类
【发布时间】:2018-07-11 04:20:36
【问题描述】:

我正在实现一个插件,我需要在其中为现有类添加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);

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

【问题讨论】:

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


【解决方案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")),这被认为更有效。

【讨论】:

  • 我要更改的类已经定义,我无法替换它的内容。我真的需要在类名和它的主体之间添加extends MyAbstractClass
  • 我不知道你说的“已经定义了所以我不能替换内容”是什么意思,但是如果你不想替换,你可以element.addAfter(),然后通过对应于extends Xxx 的 PsiElement。
  • 什么是classNamePsiElement ?您能否也看看我的更新,可能有助于理解上下文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
相关资源
最近更新 更多