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