Как изменить KtUltraLightClass? - PullRequest
0 голосов
/ 31 марта 2020

Я разрабатываю плагин и мне нужно изменить метод, который раньше выглядел так:

override fun getLayoutId(): Int {
TODO("not implemented")
}

Я надеюсь, что результат будет таким:

override fun getLayoutId(): Int {
return R.layout.myactivity
}

Теперь я сгенерировал класс KtUltraLightClass, я пытаюсь изменить его следующим образом:

if (activityClass is KtUltraLightClass){
    activityClass.kotlinOrigin.findFunctionByName("getLayoutId")
    activityClass.ownMethods.find {
        it.name=="getLayoutId"
    }?.let {
        val fieldName = AndroidResourceUtil.getRJavaFieldName(FileUtil.getNameWithoutExtension(layoutFileName))
        val layoutFieldRef = "$appPackage.R.layout.$fieldName"
        getKtStatement(it, layoutFieldRef, false)
    }
}


fun getKtStatement(method: PsiMethod, layoutFieldRef: String, isJava: Boolean) {
    val project = method.project
    WriteCommandAction.writeCommandAction(project, method.containingFile).run<Throwable> {
        val newStatement = PsiElementFactory.getInstance(project).createStatementFromText(
            "return $layoutFieldRef${if (isJava) ";" else ""}", method)
        method.add(newStatement)
        JavaCodeStyleManager.getInstance(project).shortenClassReferences(method)
        CodeStyleManager.getInstance(project).reformat(method)
    }
}

, но теперь выдает ошибку:

com.intellij.util.IncorrectOperationException: org.jetbrains.kotlin.asJava.classes.KtUltraLightMethodForSourceDeclaration
at com.intellij.psi.impl.light.LightElement.add(LightElement.java:139)
at com.longforus.mvpautocodeplus.maker.LayoutCreatorKt$getKtStatement$1.run(LayoutCreator.kt:104)
at com.intellij.openapi.command.WriteCommandAction$BuilderImpl$1.run(WriteCommandAction.java:125)
at com.intellij.openapi.application.RunResult.run(RunResult.java:35)
at com.

Скажите, пожалуйста, как его изменить.

...