Search code examples
intellij-ideakotlinjetbrains-ideintellij-plugin

Cannot Cast PsiElement to KtClass - Intellij


I'm learning to create a plugin for IntelliJ but I'm stuck at PsiElement. I can't cast PsiElement to KtClass even though it also a KtClass.

Here's the error log

java.lang.ClassCastException: org.jetbrains.kotlin.psi.KtClass cannot be cast to org.jetbrains.kotlin.psi.KtClass
    at action.MyAction.getPsiClassFromEvent(MyAction.kt:32)
    at action.MyAction.actionPerformed(MyAction.kt:21)
    at com.intellij.openapi.actionSystem.ex.ActionUtil$1.run(ActionUtil.java:261)
    at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:278)
    at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAwareWithCallbacks(ActionUtil.java:252)
    at com.intellij.ui.popup.ActionPopupStep.performAction(ActionPopupStep.java:200)
    at com.intellij.ui.popup.ActionPopupStep.performAction(ActionPopupStep.java:190)
    at com.intellij.ui.popup.ActionPopupStep.lambda$onChosen$2(ActionPopupStep.java:184)
    ...
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Here's my function

private fun getPsiClassFromEvent(e: AnActionEvent): KtClass? {
    val psiElement = e.getData(
        LangDataKeys.PSI_ELEMENT
    ) ?: return null

    return psiElement as KtClass
}

here's my gradle:

plugins {
    id 'org.jetbrains.intellij' version '0.4.15'
    id 'org.jetbrains.kotlin.jvm' version '1.3.61'
}

group 'intellijtemplate.djaka.id'
version '1.0-SNAPSHOT'

apply plugin: 'org.jetbrains.intellij'
apply plugin: 'kotlin'

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    implementation "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.61"
}

intellij {
    version '2019.1.4'
    plugins 'org.jetbrains.kotlin:1.3.11-release-IJ2018.3-1'
}

Solution

  • I've found the problem thanks too Yann Cebron. Turns out :

    1. using "import org.jetbrains.kotlin.com.intellij.psi.PsiElement" from Kotlin Plugin instead of "com.intellij.psi.PsiElement" in KtClassHelper
    2. in build.gradle, "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.61" was included into project's instead of buildscript classpath

    Full answer here: https://intellij-support.jetbrains.com/hc/en-us/community/posts/360006794080-Cannot-Cast-PsiElement-to-KtClass