Improve plugin main checks

This commit is contained in:
Him188 2020-11-13 19:18:45 +08:00
parent 9a25ac78fa
commit fb061be7cf
3 changed files with 22 additions and 29 deletions

View File

@ -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)
)
}
}

View File

@ -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()

View File

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