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")