mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-23 13:50:12 +08:00
Improve plugin main checks
This commit is contained in:
parent
9a25ac78fa
commit
fb061be7cf
@ -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)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
@ -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")
|
||||
|
Loading…
Reference in New Issue
Block a user