热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在以Kotlin编写的IntellijIDEAGradle插件项目中包含KotlinPSI类(例如KtClass)?

我正在尝试编写一个插件,以将模拟数据添加到Kotlin项目。第一部分涉及在当前

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

我一直在使用PsiViewer插件检查Kotlin类文件中的PSI树。为了访问KtFile,KtClass等,在我的build-gradle文件中向“ org.jetbrains.kotlin:kotlin-compiler-embeddable”添加了一个依赖项。在我尝试运行插件之前,这似乎还可以。我在使用例如psiFile is KtFile。我仍然可以通过对PsiFile字段的简单解析来掌握正确的text实例,但是当我尝试强制转换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)。在Windows 10上运行。

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.

most HTML tags may be used"""
}

CreateMockdataFromPostgreSQLClass.kt:

import com.intellij.openapi.actionSystem.Anaction
import com.intellij.openapi.actionSystem.AnactionEvent
import com.intellij.openapi.actionSystem.CommonDataKeys
import com.intellij.openapi.ui.Messages
import org.jetbrains.kotlin.psi.KtFile
class CreateMockdataFromPostgreSQLClass: Anaction() {
override fun actionPerformed(e: AnactionEvent) {
val project = e.getRequiredData(CommonDataKeys.PROJECT)
val kotlinFileHandler = KotlinFileHandler(project)
val dbClasses = kotlinFileHandler.getallKotlinDbClasses()
val classnames = dbClasses.map {
val ktFile = it as KtFile
ktFile.name
}.joinToString(separator = "\n")
Messages.showInfoMessage(classnames,"Test")
}
}

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 {
val roots = ProjectRootManager.getInstance(aProject).contentsourceRoots
val dirs = roots.map { PsiManager.getInstance(aProject).findDirectory(it) }
val result = mutableListOf()
getKotlinDbClassesInPsiDir(result,dirs)
return result.toList()
}
private tailrec fun getKotlinDbClassesInPsiDir(aResult: MutableList,aPsiDirectoryList: List) {
if (aPsiDirectoryList.isEmpty()) return
val subDirectories = mutableListOf()
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)
}
}

我认为我没有正确设置gradle。我已经在广泛地寻找适当的设置,但是找不到有效的解决方案。谁能指导我正确设置gradle?


您是否通过向IntelliJ任务添加插件来检查

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

请检查并更新


推荐阅读
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • iOS 小组件开发指南
    本文详细介绍了iOS小部件(Widget)的开发流程,从环境搭建、证书配置到业务逻辑实现,提供了一系列实用的技术指导与代码示例。 ... [详细]
  • Gradle 是 Android Studio 中默认的构建工具,了解其基本配置对于开发效率的提升至关重要。本文将详细介绍如何在 Gradle 中定义和使用共享变量,以确保项目的一致性和可维护性。 ... [详细]
  • 本文详细介绍了如何在最新版本的Xcode中重命名iOS项目,包括项目名称、应用名称及相关的文件夹和配置文件。通过本文,开发者可以轻松完成项目的重命名工作。 ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • 熟悉IDEA快捷键的正确姿势
    一、背景俗话说:“工欲善其事必先利其器”,现在IDEA作为主流的Java开发工具,已经广泛使用。但是很多人熟悉的快捷键是有限的 ... [详细]
  • JDK IDEA的安装卸载基本使用
    一、JDK下载地址官网https:www.oracle.comjavatechnologiesjavase-downloads.html没有账号可以使用:https:blog ... [详细]
  • 本文详细介绍了如何使用 Python 编程语言中的 Scapy 库执行 DNS 欺骗攻击,包括必要的软件安装、攻击流程及代码示例。 ... [详细]
  • HDU 2537 键盘输入处理
    题目描述了一个名叫Pirates的男孩想要开发一款键盘输入软件,遇到了大小写字母判断的问题。本文提供了该问题的解决方案及实现方法。 ... [详细]
  • 本文由公众号【数智物语】(ID: decision_engine)发布,关注获取更多干货。文章探讨了从数据收集到清洗、建模及可视化的全过程,介绍了41款实用工具,旨在帮助数据科学家和分析师提升工作效率。 ... [详细]
  • 如何使用Maven将依赖插件一并打包进JAR文件
    本文详细介绍了在使用Maven构建项目时,如何将所需的依赖插件一同打包进最终的JAR文件中,以避免手动部署依赖库的麻烦。 ... [详细]
  • 页面预渲染适用于主要包含静态内容的页面。对于依赖大量API调用的动态页面,建议采用SSR(服务器端渲染),如Nuxt等框架。更多优化策略可参见:https://github.com/HaoChuan9421/vue-cli3-optimization ... [详细]
  • 探讨了在Ionic3项目中,使用`ionic serve`命令可以正常运行,但使用`ionic build --prod`命令进行生产构建时遇到错误的原因及解决方案。 ... [详细]
  • 汇总了2023年7月7日最新的网络安全新闻和技术更新,包括最新的漏洞披露、工具发布及安全事件。 ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
author-avatar
平從老
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有