From fb061be7cf4dabc477b65791b19f493452f7068a Mon Sep 17 00:00:00 2001
From: Him188 <Him188@mamoe.net>
Date: Fri, 13 Nov 2020 19:18:45 +0800
Subject: [PATCH] Improve plugin main checks

---
 ...luginMainServiceNotConfiguredInspection.kt | 20 +++++++++++--------
 .../src/diagnostics/diagnosticsUtil.kt        | 20 ++++---------------
 .../marker/PluginMainLineMarkerProvider.kt    | 11 +++++-----
 3 files changed, 22 insertions(+), 29 deletions(-)

diff --git a/tools/intellij-plugin/src/diagnostics/PluginMainServiceNotConfiguredInspection.kt b/tools/intellij-plugin/src/diagnostics/PluginMainServiceNotConfiguredInspection.kt
index 4d9fd7e9d..3ee3aebd8 100644
--- a/tools/intellij-plugin/src/diagnostics/PluginMainServiceNotConfiguredInspection.kt
+++ b/tools/intellij-plugin/src/diagnostics/PluginMainServiceNotConfiguredInspection.kt
@@ -14,14 +14,17 @@ import com.intellij.codeInspection.ProblemsHolder
 import com.intellij.openapi.progress.impl.CancellationCheck.Companion.runWithCancellationCheck
 import com.intellij.psi.PsiElementVisitor
 import net.mamoe.mirai.console.compiler.common.resolve.AUTO_SERVICE
+import net.mamoe.mirai.console.compiler.common.resolve.PLUGIN_FQ_NAME
 import net.mamoe.mirai.console.intellij.diagnostics.fix.ConfigurePluginMainServiceFix
+import net.mamoe.mirai.console.intellij.resolve.allSuperNames
 import net.mamoe.mirai.console.intellij.resolve.hasAnnotation
 import org.jetbrains.kotlin.idea.debugger.readAction
 import org.jetbrains.kotlin.idea.inspections.AbstractKotlinInspection
 import org.jetbrains.kotlin.idea.util.module
 import org.jetbrains.kotlin.idea.util.rootManager
 import org.jetbrains.kotlin.psi.KtClassOrObject
-import org.jetbrains.kotlin.psi.referenceExpressionVisitor
+import org.jetbrains.kotlin.psi.KtObjectDeclaration
+import org.jetbrains.kotlin.psi.classOrObjectVisitor
 import java.util.*
 
 /*
@@ -39,19 +42,20 @@ class PluginMainServiceNotConfiguredInspection : AbstractKotlinInspection() {
     }
 
     override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {
-        return referenceExpressionVisitor visitor@{ referenceExpr ->
-            val ktClass = referenceExpr.resolveMiraiPluginDeclaration() ?: return@visitor
-            val fqName = ktClass.fqName?.asString() ?: return@visitor
+        return classOrObjectVisitor visitor@{ element ->
+            if (element !is KtObjectDeclaration) return@visitor
+            if (element.allSuperNames.none { it == PLUGIN_FQ_NAME }) return@visitor
+            val fqName = element.fqName?.asString() ?: return@visitor
 
-            val found = isServiceConfiguredWithAutoService(ktClass)
-                || isServiceConfiguredWithResource(ktClass, fqName)
+            val found = isServiceConfiguredWithAutoService(element)
+                || isServiceConfiguredWithResource(element, fqName)
 
             if (!found) {
                 holder.registerProblem(
-                    ktClass.nameIdentifier ?: ktClass.identifyingElement ?: ktClass,
+                    element.nameIdentifier ?: element.identifyingElement ?: element,
                     "插件主类服务未配置",
                     ProblemHighlightType.WARNING,
-                    ConfigurePluginMainServiceFix(ktClass)
+                    ConfigurePluginMainServiceFix(element)
                 )
             }
         }
diff --git a/tools/intellij-plugin/src/diagnostics/diagnosticsUtil.kt b/tools/intellij-plugin/src/diagnostics/diagnosticsUtil.kt
index 77c5f2019..86481de29 100644
--- a/tools/intellij-plugin/src/diagnostics/diagnosticsUtil.kt
+++ b/tools/intellij-plugin/src/diagnostics/diagnosticsUtil.kt
@@ -9,19 +9,16 @@
 
 package net.mamoe.mirai.console.intellij.diagnostics
 
-import com.intellij.util.castSafelyTo
 import net.mamoe.mirai.console.compiler.common.castOrNull
-import net.mamoe.mirai.console.compiler.common.resolve.PLUGIN_FQ_NAME
-import net.mamoe.mirai.console.compiler.common.resolve.parents
-import net.mamoe.mirai.console.intellij.resolve.allSuperNames
 import net.mamoe.mirai.console.intellij.resolve.getResolvedCall
 import org.jetbrains.kotlin.descriptors.CallableDescriptor
 import org.jetbrains.kotlin.diagnostics.Diagnostic
 import org.jetbrains.kotlin.idea.refactoring.fqName.getKotlinFqName
 import org.jetbrains.kotlin.idea.references.mainReference
 import org.jetbrains.kotlin.name.FqName
-import org.jetbrains.kotlin.nj2k.postProcessing.resolve
-import org.jetbrains.kotlin.psi.*
+import org.jetbrains.kotlin.psi.KtElement
+import org.jetbrains.kotlin.psi.KtTypeReference
+import org.jetbrains.kotlin.psi.KtUserType
 import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
 import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext
 
@@ -43,13 +40,4 @@ fun KtTypeReference.isReferencing(fqName: FqName): Boolean {
 
 val KtTypeReference.referencedUserType: KtUserType? get() = this.typeElement.castOrNull()
 
-fun KtTypeReference.resolveReferencedType() = referencedUserType?.referenceExpression?.mainReference?.resolve()
-
-fun KtReferenceExpression.resolveMiraiPluginDeclaration(): KtClassOrObject? {
-    val main =
-        parents.filterIsInstance<KtClassOrObject>().firstOrNull() ?: return null
-    val kotlinPluginClass =
-        resolve().castSafelyTo<KtConstructor<*>>()?.parent?.castSafelyTo<KtClass>() ?: return null
-    if (kotlinPluginClass.allSuperNames.none { it == PLUGIN_FQ_NAME }) return null
-    return main
-}
+fun KtTypeReference.resolveReferencedType() = referencedUserType?.referenceExpression?.mainReference?.resolve()
\ No newline at end of file
diff --git a/tools/intellij-plugin/src/line/marker/PluginMainLineMarkerProvider.kt b/tools/intellij-plugin/src/line/marker/PluginMainLineMarkerProvider.kt
index 86549b070..979822e46 100644
--- a/tools/intellij-plugin/src/line/marker/PluginMainLineMarkerProvider.kt
+++ b/tools/intellij-plugin/src/line/marker/PluginMainLineMarkerProvider.kt
@@ -15,16 +15,17 @@ import com.intellij.codeInsight.daemon.LineMarkerProvider
 import com.intellij.openapi.actionSystem.AnAction
 import com.intellij.openapi.editor.markup.GutterIconRenderer
 import com.intellij.psi.PsiElement
+import net.mamoe.mirai.console.compiler.common.resolve.PLUGIN_FQ_NAME
 import net.mamoe.mirai.console.intellij.Icons
-import net.mamoe.mirai.console.intellij.diagnostics.resolveMiraiPluginDeclaration
+import net.mamoe.mirai.console.intellij.resolve.allSuperNames
 import net.mamoe.mirai.console.intellij.resolve.getElementForLineMark
-import org.jetbrains.kotlin.psi.KtReferenceExpression
+import org.jetbrains.kotlin.psi.KtObjectDeclaration
 
 class PluginMainLineMarkerProvider : LineMarkerProvider {
     override fun getLineMarkerInfo(element: PsiElement): LineMarkerInfo<*>? {
-        if (element !is KtReferenceExpression) return null
-        val main = element.resolveMiraiPluginDeclaration() ?: return null
-        return Info(getElementForLineMark(main))
+        if (element !is KtObjectDeclaration) return null
+        if (element.allSuperNames.any { it == PLUGIN_FQ_NAME }) return Info(getElementForLineMark(element))
+        return null
     }
 
     @Suppress("DEPRECATION")