如何在用Kotlin编写的Intellij IDEA Gradle插件项目中包含Kotlin PSI类(如KtClass)?

如何在用Kotlin编写的Intellij IDEA Gradle插件项目中包含Kotlin PSI类(如KtClass)?,gradle,intellij-idea,kotlin,intellij-plugin,Gradle,Intellij Idea,Kotlin,Intellij Plugin,我正在尝试编写一个插件,将模拟数据添加到Kotlin项目中。第一部分涉及查找当前项目中从特定基类继承的所有Kotlin类。我希望能够解析这些类以读取注释的值并获得构造函数的结构。然后,这些信息将用于向项目中添加代码,并将选定类的实例添加到模拟数据库实例中 我一直在使用PsiViewer插件检查Kotlin类文件中的PSI树。为了访问KtFile、KtClass等,我在buildgradle文件中的“org.jetbrains.kotlin:kotlin compiler embeddeble”中

我正在尝试编写一个插件,将模拟数据添加到Kotlin项目中。第一部分涉及查找当前项目中从特定基类继承的所有Kotlin类。我希望能够解析这些类以读取注释的值并获得构造函数的结构。然后,这些信息将用于向项目中添加代码,并将选定类的实例添加到模拟数据库实例中

我一直在使用PsiViewer插件检查Kotlin类文件中的PSI树。为了访问KtFile、KtClass等,我在buildgradle文件中的“org.jetbrains.kotlin:kotlin compiler embeddeble”中添加了一个依赖项。在我尝试运行插件之前,这似乎还可以。使用时,我从未获得匹配项,例如,
psiFile是KtFile
。通过对
文本
字段的简单解析,我仍然能够获得正确的
PsiFile
实例,但当我尝试强制转换
PsiFile
实例时,我得到以下异常:

java.lang.ClassCastException: class org.jetbrains.kotlin.psi.KtFile cannot be cast to class org.jetbrains.kotlin.psi.KtFile (org.jetbrains.kotlin.psi.KtFile is in unnamed module of loader com.intellij.ide.plugins.cl.PluginClassLoader @2ed18f3d; org.jetbrains.kotlin.psi.KtFile is in unnamed module of loader com.intellij.ide.plugins.cl.PluginClassLoader @4308c14c)
目前我正在使用IntelliJ IDEA 2019.2.3。尝试使用不同版本的kotlin插件(1.3.31和1.3.41)。在Windows10上运行

build.gradle

plugins {
    id 'java'
    id 'org.jetbrains.intellij' version '0.4.11'
    id 'org.jetbrains.kotlin.jvm' version '1.3.31'
}

group 'se.winassist'
version '1.0'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    implementation "org.jetbrains.kotlin:kotlin-compiler-embeddable:1.3.31"
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

// See https://github.com/JetBrains/gradle-intellij-plugin/
intellij {
    version '2019.2.3'
}
compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
patchPluginXml {
    changeNotes """
      Add change notes here.<br>
      <em>most HTML tags may be used</em>"""
}
KotlinFileHandler.kt

import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.psi.PsiDirectory
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager

data class KotlinFileHandler(val aProject: Project) {

    fun getAllKotlinDbClasses(): List<PsiFile> {
        val roots = ProjectRootManager.getInstance(aProject).contentSourceRoots
        val dirs = roots.map { PsiManager.getInstance(aProject).findDirectory(it) }
        val result = mutableListOf<PsiFile>()
        getKotlinDbClassesInPsiDir(result, dirs)
        return result.toList()
    }

    private tailrec fun getKotlinDbClassesInPsiDir(aResult: MutableList<PsiFile>, aPsiDirectoryList: List<PsiDirectory?>) {
        if (aPsiDirectoryList.isEmpty()) return

        val subDirectories = mutableListOf<PsiDirectory>()
        aPsiDirectoryList.filter { it != null }.forEach {
            val children = it!!.children
            val files = children.filter {
                it is PsiFile && it.language.toString().toLowerCase() == "language: kotlin"
            }.map { it as PsiFile }
            subDirectories += children.filter { it is PsiDirectory }.map { it as PsiDirectory }
            aResult += files.filter {
                hasBasePersistenceSuperclass(it) && hasTableNameAnnotation(it)
            }.toList()
        }
        getKotlinDbClassesInPsiDir(aResult, subDirectories)
    }
}
import com.intellij.openapi.project.project
导入com.intellij.openapi.root.ProjectRootManager
导入com.intellij.psi.psi目录
导入com.intellij.psi.psi文件
导入com.intellij.psi.PsiManager
数据类KotlinFileHandler(val项目:项目){
fun GetAllKotLindbClass():列表{
val root=ProjectRootManager.getInstance(aProject).contentSourceRoots
val dirs=root.map{PsiManager.getInstance(aProject.findDirectory(it)}
val result=mutableListOf()
GetKotlindbclassensinpsidir(结果,dirs)
返回result.toList()
}
private tailrec fun getkotlindbclassensipsidir(aResult:MutableList,aPsiDirectoryList:List){
if(aPsiDirectoryList.isEmpty())返回
val子目录=mutableListOf()
aPsiDirectoryList.filter{it!=null}.forEach{
val children=it!!.children
val files=children.filter{
它是PsiFile&&it.language.toString().toLowerCase()=“语言:kotlin”
}.map{it as PsiFile}
子目录+=children.filter{it is PsiDirectory}.map{it as PsiDirectory}
aResult+=files.filter{
hasBasePersistenceSuperclass(it)和hasTableNameAnnotation(it)
}托利斯先生()
}
GetKotlindbclassensipsidir(aResult,子目录)
}
}

我想我没有正确地设置gradle。我已经广泛地寻找了一个合适的设置,但没有找到一个有效的解决方案。有人能告诉我正确的gradle设置吗?

您是否通过向IntelliJ任务添加插件进行了检查

intellij {
  version '2020.1'
  plugins = ['java','Kotlin']
  intellij.type = 'IC'
}

请检查并更新

此线程是否相关?
intellij {
  version '2020.1'
  plugins = ['java','Kotlin']
  intellij.type = 'IC'
}