修改一个 Kotlin class
modify a Kotlin class
我想为 Intellij IDEA 编写一个插件,应该修改 Java 和 Kotlin 代码。
我用的方法
PsiClass.getMethods()
为了获得Java和Kotlin classes的所有方法。到目前为止一切顺利,所以我使用
之类的方法
PsiClass.add(), PsiClass.addAfter(), PsiClass.addBefore()
在 Java 文件上调用后一切正常,但开始抛出异常
IncorrectOperationException
有一次我在 Kotlin 上给他们打电话 class。
对于如何修改 Kotlin 和 Java classes(最好使用相同的方法)的任何提示,我将不胜感激。
当您通过 JavaPsiFacade
搜索 Kotlin class 时,它 return 是光 class,这是一种仅基于信息的浅层表示在 class 文件中。为了添加 PSI 元素,您必须对其调用 navigationElement
。然后,IJ会解析源码,构建完整的PSI树,可以修改。
但是,如果 class 是 Kotlin class,navigationElement
将 return 不是从 PsiClass
派生的 KtClass
.您将不得不使用 Kotlin 层次结构中的工具来修改它。 Kotlin 中的方法实例也不是 PsiMethod
的实例,而是 KtMethod
.
的实例
为了以通用方式分析 Java 和 Kotlin 源代码,有一个名为 "UAST" 的不同语法树,但对于修改,您需要 language-specific 方法。
我想为 Intellij IDEA 编写一个插件,应该修改 Java 和 Kotlin 代码。
我用的方法
PsiClass.getMethods()
为了获得Java和Kotlin classes的所有方法。到目前为止一切顺利,所以我使用
之类的方法PsiClass.add(), PsiClass.addAfter(), PsiClass.addBefore()
在 Java 文件上调用后一切正常,但开始抛出异常
IncorrectOperationException
有一次我在 Kotlin 上给他们打电话 class。
对于如何修改 Kotlin 和 Java classes(最好使用相同的方法)的任何提示,我将不胜感激。
当您通过 JavaPsiFacade
搜索 Kotlin class 时,它 return 是光 class,这是一种仅基于信息的浅层表示在 class 文件中。为了添加 PSI 元素,您必须对其调用 navigationElement
。然后,IJ会解析源码,构建完整的PSI树,可以修改。
但是,如果 class 是 Kotlin class,navigationElement
将 return 不是从 PsiClass
派生的 KtClass
.您将不得不使用 Kotlin 层次结构中的工具来修改它。 Kotlin 中的方法实例也不是 PsiMethod
的实例,而是 KtMethod
.
为了以通用方式分析 Java 和 Kotlin 源代码,有一个名为 "UAST" 的不同语法树,但对于修改,您需要 language-specific 方法。