изменить класс Kotlin

Я хотел бы написать плагин для Intellij IDEA, который должен изменить код Java и Kotlin.

Я использую метод

PsiClass.getMethods() 

чтобы получить все методы классов Java и Kotlin. Пока все хорошо, поэтому я использую такие методы, как

 PsiClass.add(), PsiClass.addAfter(), PsiClass.addBefore() 

что все работает нормально, когда они вызываются на Java-файлы, но начинают бросать исключение

 IncorrectOperationException 

как только я позвонил им в класс Котлин.

Я был бы признателен за любой намек на то, как я могу модифицировать классы Kotlin и Java (желательно с использованием того же подхода).

Когда вы ищете класс Kotlin через JavaPsiFacade , он возвращает класс light, который является неглубоким представлением, которое основано только на информации в файле класса. Чтобы добавить элементы PSI, вам нужно вызвать navigationElement . Затем IJ проанализирует источник и построит полное дерево PSI, которое можно изменить.

Однако, если класс является классом Kotlin, navigationElement вернет KtClass который не является производным от PsiClass . Вам необходимо будет использовать объекты в иерархии Котлин, чтобы изменить их. Экземпляры метода в Котлине также не являются экземплярами PsiMethod , но экземплярами KtMethod .

Для анализа источников Java и Kotlin в общем случае существует другое синтаксическое дерево, называемое «UAST», но для модификаций вам нужен языковой подход.