ConfigurePluginMainServiceFix.kt 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*
  2. * Copyright 2019-2021 Mamoe Technologies and contributors.
  3. *
  4. * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
  5. * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
  6. *
  7. * https://github.com/mamoe/mirai/blob/dev/LICENSE
  8. */
  9. package net.mamoe.mirai.console.intellij.diagnostics.fix
  10. import com.intellij.codeInspection.LocalQuickFix
  11. import com.intellij.openapi.editor.Editor
  12. import com.intellij.openapi.project.Project
  13. import com.intellij.openapi.project.rootManager
  14. import com.intellij.openapi.vfs.VfsUtil
  15. import com.intellij.psi.PsiElement
  16. import com.intellij.psi.PsiFile
  17. import net.mamoe.mirai.console.intellij.creator.tasks.readChildText
  18. import net.mamoe.mirai.console.intellij.creator.tasks.writeChild
  19. import org.jetbrains.kotlin.idea.core.isAndroidModule
  20. import org.jetbrains.kotlin.idea.inspections.KotlinUniversalQuickFix
  21. import org.jetbrains.kotlin.idea.quickfix.KotlinCrossLanguageQuickFixAction
  22. import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
  23. import org.jetbrains.kotlin.idea.util.module
  24. class ConfigurePluginMainServiceFix(
  25. element: PsiElement,
  26. private val fqName: String,
  27. ) : KotlinCrossLanguageQuickFixAction<PsiElement>(element), KotlinUniversalQuickFix, LocalQuickFix {
  28. override fun getFamilyName(): String = "Mirai Console"
  29. override fun getText(): String = "配置插件主类服务"
  30. override fun invokeImpl(project: Project, editor: Editor?, file: PsiFile) {
  31. val elementFqName = fqName
  32. val sourceRoots = file.module?.rootManager?.sourceRoots ?: return
  33. val sourceRoot = sourceRoots.find { it.name.endsWith("resources") }
  34. ?: sourceRoots.find { it.name.endsWith("res") }
  35. ?: sourceRoots.find { it.name.contains("resources") }
  36. ?: sourceRoots.find { it.name.contains("res") }
  37. ?: sourceRoots.last().run {
  38. project.executeWriteCommand(name, groupId = null) {
  39. parent.createChildDirectory(
  40. this@ConfigurePluginMainServiceFix,
  41. if (file.module?.isAndroidModule() == true) "res" else "resources"
  42. )
  43. }
  44. }
  45. project.executeWriteCommand(name) {
  46. val filepath = "META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin"
  47. fun computeContent(): String {
  48. val origin = sourceRoot.readChildText(filepath) ?: ""
  49. return when {
  50. origin.isBlank() -> elementFqName
  51. origin.endsWith("\n") -> origin + elementFqName
  52. else -> "$origin\n$elementFqName"
  53. }
  54. }
  55. sourceRoot.writeChild(filepath, computeContent())
  56. VfsUtil.markDirtyAndRefresh(true, false, false, sourceRoot.findChild(filepath))
  57. }
  58. }
  59. }