From 717c908ccfa9624c62602432318c29374f1a52b8 Mon Sep 17 00:00:00 2001
From: Him188 <Him188@mamoe.net>
Date: Sun, 25 Oct 2020 13:16:27 +0800
Subject: [PATCH] Support multiple ResolveContext kinds in single declaration

---
 .../mamoe/mirai/console/command/RawCommand.kt |  2 +-
 .../console/command/java/JCompositeCommand.kt |  2 +
 .../mirai/console/command/java/JRawCommand.kt |  2 +
 .../console/command/java/JSimpleCommand.kt    |  5 +-
 .../console/compiler/common/ResolveContext.kt | 68 +++++++++++++++----
 .../internal/plugin/JvmPluginInternal.kt      |  2 +-
 .../console/permission/PermissionService.kt   | 14 +---
 .../plugin/description/PluginDescription.kt   |  2 +-
 .../console/plugin/jvm/AbstractJvmPlugin.kt   |  2 +-
 .../plugin/jvm/JvmPluginDescription.kt        |  6 +-
 .../mamoe/mirai/console/util/SemVersion.kt    |  8 +--
 .../compiler/common/resolve/resolveTypes.kt   | 14 ++--
 .../ContextualParametersChecker.kt            | 10 ++-
 .../diagnostics/PluginDataValuesChecker.kt    |  4 +-
 .../intellij/diagnostics/diagnosticsUtil.kt   |  4 +-
 .../console/intellij/resolve/resolveIdea.kt   |  4 +-
 16 files changed, 93 insertions(+), 56 deletions(-)

diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/RawCommand.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/RawCommand.kt
index 2486f6f42..56bb6a968 100644
--- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/RawCommand.kt
+++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/RawCommand.kt
@@ -11,7 +11,6 @@
 
 package net.mamoe.mirai.console.command
 
-import net.mamoe.mirai.console.command.CommandManager.INSTANCE.executeCommand
 import net.mamoe.mirai.console.command.descriptor.*
 import net.mamoe.mirai.console.command.java.JRawCommand
 import net.mamoe.mirai.console.compiler.common.ResolveContext
@@ -51,6 +50,7 @@ public abstract class RawCommand(
     /** 指令父权限 */
     parentPermission: Permission = owner.parentPermission,
     /** 为 `true` 时表示 [指令前缀][CommandManager.commandPrefix] 可选 */
+    @OptIn(ExperimentalCommandDescriptors::class)
     public override val prefixOptional: Boolean = false,
 ) : Command {
     public override val permission: Permission by lazy { createOrFindCommandPermission(parentPermission) }
diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JCompositeCommand.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JCompositeCommand.kt
index fa0b9203a..775542e99 100644
--- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JCompositeCommand.kt
+++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JCompositeCommand.kt
@@ -13,6 +13,7 @@ import net.mamoe.mirai.console.command.BuiltInCommands
 import net.mamoe.mirai.console.command.CommandManager
 import net.mamoe.mirai.console.command.CommandOwner
 import net.mamoe.mirai.console.command.CompositeCommand
+import net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors
 import net.mamoe.mirai.console.command.descriptor.buildCommandArgumentContext
 import net.mamoe.mirai.console.compiler.common.ResolveContext
 import net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.COMMAND_NAME
@@ -85,6 +86,7 @@ public abstract class JCompositeCommand
         protected set
 
     /** 为 `true` 时表示 [指令前缀][CommandManager.commandPrefix] 可选 */
+    @ExperimentalCommandDescriptors
     public final override var prefixOptional: Boolean = false
         protected set
 
diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JRawCommand.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JRawCommand.kt
index 19cf70d2a..539c409a1 100644
--- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JRawCommand.kt
+++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JRawCommand.kt
@@ -13,6 +13,7 @@ import net.mamoe.mirai.console.command.BuiltInCommands
 import net.mamoe.mirai.console.command.Command
 import net.mamoe.mirai.console.command.CommandManager
 import net.mamoe.mirai.console.command.CommandOwner
+import net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors
 import net.mamoe.mirai.console.compiler.common.ResolveContext
 import net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.COMMAND_NAME
 import net.mamoe.mirai.console.internal.command.createOrFindCommandPermission
@@ -70,6 +71,7 @@ public abstract class JRawCommand
         protected set
 
     /** 为 `true` 时表示 [指令前缀][CommandManager.commandPrefix] 可选 */
+    @ExperimentalCommandDescriptors
     public final override var prefixOptional: Boolean = false
         protected set
 }
\ No newline at end of file
diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JSimpleCommand.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JSimpleCommand.kt
index 4333bfa45..bb56daeba 100644
--- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JSimpleCommand.kt
+++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JSimpleCommand.kt
@@ -10,10 +10,10 @@
 package net.mamoe.mirai.console.command.java
 
 import net.mamoe.mirai.console.command.CommandManager
-import net.mamoe.mirai.console.command.CommandManager.INSTANCE.executeCommand
 import net.mamoe.mirai.console.command.CommandOwner
 import net.mamoe.mirai.console.command.SimpleCommand
 import net.mamoe.mirai.console.command.descriptor.CommandArgumentContext
+import net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors
 import net.mamoe.mirai.console.compiler.common.ResolveContext
 import net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.COMMAND_NAME
 import net.mamoe.mirai.console.permission.Permission
@@ -52,9 +52,10 @@ public abstract class JSimpleCommand(
 ) : SimpleCommand(owner, primaryName, secondaryNames = secondaryNames, parentPermission = basePermission) {
     public override var description: String = super.description
         protected set
-
     public override var permission: Permission = super.permission
         protected set
+
+    @ExperimentalCommandDescriptors
     public override var prefixOptional: Boolean = super.prefixOptional
         protected set
     public override var context: CommandArgumentContext = super.context
diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/compiler/common/ResolveContext.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/compiler/common/ResolveContext.kt
index a10aa00d8..350e20ada 100644
--- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/compiler/common/ResolveContext.kt
+++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/compiler/common/ResolveContext.kt
@@ -11,22 +11,21 @@
 
 package net.mamoe.mirai.console.compiler.common
 
-import net.mamoe.mirai.console.util.ConsoleExperimentalApi
+import net.mamoe.mirai.console.command.Command
+import net.mamoe.mirai.console.data.PluginData
+import net.mamoe.mirai.console.data.value
+import net.mamoe.mirai.console.permission.PermissionId
+import net.mamoe.mirai.console.plugin.description.PluginDescription
+import net.mamoe.mirai.console.util.SemVersion
 import kotlin.annotation.AnnotationTarget.*
 
 /**
  * 标记一个参数的语境类型, 用于帮助编译器和 IntelliJ 插件进行语境推断.
  */
-@ConsoleExperimentalApi
-@Target(
-    VALUE_PARAMETER,
-    PROPERTY, FIELD,
-    FUNCTION,
-    TYPE, TYPE_PARAMETER
-)
+@Target(VALUE_PARAMETER, PROPERTY, FIELD, FUNCTION, TYPE, TYPE_PARAMETER)
 @Retention(AnnotationRetention.BINARY)
 public annotation class ResolveContext(
-    val kind: Kind,
+    vararg val kinds: Kind,
 ) {
     /**
      * 元素数量可能在任意时间被改动
@@ -36,18 +35,57 @@ public annotation class ResolveContext(
         // ConstantKind
         ///////////////////////////////////////////////////////////////////////////
 
-        PLUGIN_ID, // ILLEGAL_PLUGIN_DESCRIPTION
-        PLUGIN_NAME, // ILLEGAL_PLUGIN_DESCRIPTION
-        PLUGIN_VERSION, // ILLEGAL_PLUGIN_DESCRIPTION
+        /*
+         * WARNING: IF YOU CHANGE NAMES HERE,
+         * YOU SHOULD ALSO CHANGE THEIR COUNTERPARTS AT net.mamoe.mirai.console.compiler.common.resolve.ResolveContextKind
+         */
 
+        /**
+         * @see PluginDescription.id
+         */
+        PLUGIN_ID, // ILLEGAL_PLUGIN_DESCRIPTION
+
+        /**
+         * @see PluginDescription.name
+         */
+        PLUGIN_NAME, // ILLEGAL_PLUGIN_DESCRIPTION
+
+        /**
+         * @see PluginDescription.version
+         * @see SemVersion.Companion.invoke
+         */
+        SEMANTIC_VERSION, // ILLEGAL_PLUGIN_DESCRIPTION
+
+        /**
+         * @see SemVersion.Companion.parseRangeRequirement
+         */
         VERSION_REQUIREMENT, // ILLEGAL_VERSION_REQUIREMENT // TODO
 
+        /**
+         * @see Command.allNames
+         */
         COMMAND_NAME, // ILLEGAL_COMMAND_NAME
 
-        PERMISSION_NAMESPACE, // ILLEGAL_COMMAND_NAMESPACE
-        PERMISSION_NAME, // ILLEGAL_COMMAND_NAME
-        PERMISSION_ID, // ILLEGAL_COMMAND_ID
+        /**
+         * @see PermissionId.name
+         */
+        PERMISSION_NAMESPACE, // ILLEGAL_PERMISSION_NAMESPACE
 
+        /**
+         * @see PermissionId.name
+         */
+        PERMISSION_NAME, // ILLEGAL_PERMISSION_NAME
+
+        /**
+         * @see PermissionId.parseFromString
+         */
+        PERMISSION_ID, // ILLEGAL_PERMISSION_ID
+
+        /**
+         * 标注一个泛型, 要求这个泛型必须拥有一个公开无参 (或所有参数都可选) 构造器.
+         *
+         * @see PluginData.value
+         */
         RESTRICTED_NO_ARG_CONSTRUCTOR, // NOT_CONSTRUCTABLE_TYPE
     }
 }
\ No newline at end of file
diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/plugin/JvmPluginInternal.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/plugin/JvmPluginInternal.kt
index 448f3feba..33ce08713 100644
--- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/plugin/JvmPluginInternal.kt
+++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/plugin/JvmPluginInternal.kt
@@ -48,7 +48,7 @@ internal abstract class JvmPluginInternal(
 
     final override val parentPermission: Permission by lazy {
         PermissionService.INSTANCE.register(
-            PermissionService.INSTANCE.allocatePermissionIdForPlugin(this, "*", PermissionService.PluginPermissionIdRequestType.PLUGIN_ROOT_PERMISSION),
+            PermissionService.INSTANCE.allocatePermissionIdForPlugin(this, "*"),
             "The base permission"
         )
     }
diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/permission/PermissionService.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/permission/PermissionService.kt
index fcd3ee841..363393092 100644
--- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/permission/PermissionService.kt
+++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/permission/PermissionService.kt
@@ -97,8 +97,7 @@ public interface PermissionService<P : Permission> {
     public fun allocatePermissionIdForPlugin(
         plugin: Plugin,
         @ResolveContext(COMMAND_NAME) permissionName: String,
-        reason: PluginPermissionIdRequestType
-    ): PermissionId = allocatePermissionIdForPluginDefaultImplement(plugin, permissionName, reason)
+    ): PermissionId = allocatePermissionIdForPluginDefaultImplement(plugin, permissionName)
 
     ///////////////////////////////////////////////////////////////////////////
 
@@ -127,16 +126,6 @@ public interface PermissionService<P : Permission> {
     @Throws(UnsupportedOperationException::class)
     public fun cancel(permitteeId: PermitteeId, permission: P, recursive: Boolean)
 
-    /** [Plugin] 尝试分配的 [PermissionId] 来源 */
-    @ConsoleExperimentalApi
-    public enum class PluginPermissionIdRequestType {
-        /** For [Plugin.parentPermission] */
-        PLUGIN_ROOT_PERMISSION,
-
-        /** For [Plugin.permissionId] */
-        NORMAL
-    }
-
     public companion object {
         internal var instanceField: PermissionService<*>? = null
 
@@ -155,7 +144,6 @@ public interface PermissionService<P : Permission> {
         internal fun PermissionService<*>.allocatePermissionIdForPluginDefaultImplement(
             plugin: Plugin,
             @ResolveContext(COMMAND_NAME) permissionName: String,
-            reason: PluginPermissionIdRequestType
         ) = PermissionId(
             plugin.description.id.toLowerCase(),
             permissionName.toLowerCase()
diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/description/PluginDescription.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/description/PluginDescription.kt
index ca9267495..7c84a2807 100644
--- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/description/PluginDescription.kt
+++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/description/PluginDescription.kt
@@ -92,7 +92,7 @@ public interface PluginDescription {
      *
      * @see Semver 语义化版本. 允许 [宽松][Semver.SemverType.LOOSE] 类型版本.
      */
-    @ResolveContext(PLUGIN_VERSION)
+    @ResolveContext(SEMANTIC_VERSION)
     public val version: SemVersion
 
     /**
diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/jvm/AbstractJvmPlugin.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/jvm/AbstractJvmPlugin.kt
index ce5f98ce3..1f19786fa 100644
--- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/jvm/AbstractJvmPlugin.kt
+++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/jvm/AbstractJvmPlugin.kt
@@ -39,7 +39,7 @@ public abstract class AbstractJvmPlugin @JvmOverloads constructor(
     public final override val loader: JvmPluginLoader get() = super<JvmPluginInternal>.loader
 
     public final override fun permissionId(name: String): PermissionId =
-        PermissionService.INSTANCE.allocatePermissionIdForPlugin(this, name, PermissionService.PluginPermissionIdRequestType.NORMAL)
+        PermissionService.INSTANCE.allocatePermissionIdForPlugin(this, name)
 
     /**
      * 重载 [PluginData]
diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/jvm/JvmPluginDescription.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/jvm/JvmPluginDescription.kt
index edf5d99af..b147e8873 100644
--- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/jvm/JvmPluginDescription.kt
+++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/jvm/JvmPluginDescription.kt
@@ -43,7 +43,7 @@ public interface JvmPluginDescription : PluginDescription {
             /**
              * @see [PluginDescription.version]
              */
-            @ResolveContext(PLUGIN_VERSION) version: String,
+            @ResolveContext(SEMANTIC_VERSION) version: String,
             /**
              * @see [PluginDescription.name]
              */
@@ -102,7 +102,7 @@ public class JvmPluginDescriptionBuilder(
 ) {
     public constructor(
         @ResolveContext(PLUGIN_ID) id: String,
-        @ResolveContext(PLUGIN_VERSION) version: String,
+        @ResolveContext(SEMANTIC_VERSION) version: String,
     ) : this(id, SemVersion(version))
 
     private var name: String = id
@@ -115,7 +115,7 @@ public class JvmPluginDescriptionBuilder(
         apply { this.name = value.trim() }
 
     @ILoveKuriyamaMiraiForever
-    public fun version(@ResolveContext(PLUGIN_VERSION) value: String): JvmPluginDescriptionBuilder =
+    public fun version(@ResolveContext(SEMANTIC_VERSION) value: String): JvmPluginDescriptionBuilder =
         apply { this.version = SemVersion(value) }
 
     @ILoveKuriyamaMiraiForever
diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/util/SemVersion.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/util/SemVersion.kt
index 5e23cb505..779b97e5d 100644
--- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/util/SemVersion.kt
+++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/util/SemVersion.kt
@@ -21,7 +21,7 @@ import kotlinx.serialization.Serializable
 import kotlinx.serialization.Transient
 import kotlinx.serialization.builtins.serializer
 import net.mamoe.mirai.console.compiler.common.ResolveContext
-import net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.PLUGIN_VERSION
+import net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.SEMANTIC_VERSION
 import net.mamoe.mirai.console.compiler.common.ResolveContext.Kind.VERSION_REQUIREMENT
 import net.mamoe.mirai.console.internal.data.map
 import net.mamoe.mirai.console.internal.util.semver.SemVersionInternal
@@ -115,7 +115,7 @@ internal constructor(
         @JvmStatic
         @JvmName("parse")
         @Throws(IllegalArgumentException::class, NumberFormatException::class)
-        public operator fun invoke(@ResolveContext(PLUGIN_VERSION) version: String): SemVersion = SemVersionInternal.parse(version)
+        public operator fun invoke(@ResolveContext(SEMANTIC_VERSION) version: String): SemVersion = SemVersionInternal.parse(version)
 
         /**
          * 解析一条依赖需求描述, 在无法解析的时候抛出 [IllegalArgumentException]
@@ -155,7 +155,7 @@ internal constructor(
         /** @see [Requirement.test] */
         @JvmStatic
         @Throws(IllegalArgumentException::class, NumberFormatException::class)
-        public fun Requirement.test(@ResolveContext(PLUGIN_VERSION) version: String): Boolean = test(invoke(version))
+        public fun Requirement.test(@ResolveContext(SEMANTIC_VERSION) version: String): Boolean = test(invoke(version))
 
         /**
          * 当满足 [requirement] 时返回 true, 否则返回 false
@@ -178,7 +178,7 @@ internal constructor(
         /** for Kotlin only */
         @JvmStatic
         @JvmSynthetic
-        public operator fun Requirement.contains(@ResolveContext(PLUGIN_VERSION) version: String): Boolean = test(version)
+        public operator fun Requirement.contains(@ResolveContext(SEMANTIC_VERSION) version: String): Boolean = test(version)
     }
 
     @Transient
diff --git a/tools/compiler-common/src/main/kotlin/net/mamoe/mirai/console/compiler/common/resolve/resolveTypes.kt b/tools/compiler-common/src/main/kotlin/net/mamoe/mirai/console/compiler/common/resolve/resolveTypes.kt
index 59f356cc9..b09530ae4 100644
--- a/tools/compiler-common/src/main/kotlin/net/mamoe/mirai/console/compiler/common/resolve/resolveTypes.kt
+++ b/tools/compiler-common/src/main/kotlin/net/mamoe/mirai/console/compiler/common/resolve/resolveTypes.kt
@@ -13,6 +13,7 @@ import net.mamoe.mirai.console.compiler.common.castOrNull
 import net.mamoe.mirai.console.compiler.common.firstValue
 import org.jetbrains.kotlin.descriptors.annotations.Annotated
 import org.jetbrains.kotlin.name.FqName
+import org.jetbrains.kotlin.resolve.constants.ArrayValue
 import org.jetbrains.kotlin.resolve.constants.EnumValue
 
 ///////////////////////////////////////////////////////////////////////////
@@ -73,11 +74,14 @@ enum class ResolveContextKind {
     }
 }
 
-fun Annotated.isResolveContext(kind: ResolveContextKind) = this.resolveContextKind == kind
-
-val Annotated.resolveContextKind: ResolveContextKind?
+val Annotated.resolveContextKinds: List<ResolveContextKind>?
     get() {
         val ann = this.findAnnotation(RESOLVE_CONTEXT_FQ_NAME) ?: return null
-        val (_, enumEntryName) = ann.allValueArguments.firstValue().castOrNull<EnumValue>()?.value ?: return null // undetermined kind
-        return ResolveContextKind.valueOf(enumEntryName.asString())
+        val kinds =
+            ann.allValueArguments.firstValue().castOrNull<ArrayValue>()?.value?.mapNotNull { it.castOrNull<EnumValue>()?.value }
+                ?: return null // undetermined kind
+
+        return kinds.map { (_, enumEntryName) ->
+            ResolveContextKind.valueOf(enumEntryName.asString())
+        }
     }
\ No newline at end of file
diff --git a/tools/intellij-plugin/src/main/kotlin/net/mamoe/mirai/console/intellij/diagnostics/ContextualParametersChecker.kt b/tools/intellij-plugin/src/main/kotlin/net/mamoe/mirai/console/intellij/diagnostics/ContextualParametersChecker.kt
index ecf455dc4..ab82110a8 100644
--- a/tools/intellij-plugin/src/main/kotlin/net/mamoe/mirai/console/intellij/diagnostics/ContextualParametersChecker.kt
+++ b/tools/intellij-plugin/src/main/kotlin/net/mamoe/mirai/console/intellij/diagnostics/ContextualParametersChecker.kt
@@ -12,7 +12,7 @@ package net.mamoe.mirai.console.intellij.diagnostics
 import com.intellij.psi.PsiElement
 import net.mamoe.mirai.console.compiler.common.diagnostics.MiraiConsoleErrors.*
 import net.mamoe.mirai.console.compiler.common.resolve.ResolveContextKind
-import net.mamoe.mirai.console.compiler.common.resolve.resolveContextKind
+import net.mamoe.mirai.console.compiler.common.resolve.resolveContextKinds
 import net.mamoe.mirai.console.intellij.resolve.resolveAllCalls
 import net.mamoe.mirai.console.intellij.resolve.resolveStringConstantValues
 import net.mamoe.mirai.console.intellij.resolve.valueParametersWithArguments
@@ -134,12 +134,18 @@ class ContextualParametersChecker : DeclarationChecker {
         context: DeclarationCheckerContext,
     ) {
         declaration.resolveAllCalls(context.bindingContext)
+            .asSequence()
             .flatMap { call ->
                 call.valueParametersWithArguments().asSequence()
             }
             .mapNotNull { (p, a) ->
-                p.resolveContextKind?.let(checkersMap::get)?.let { it to a }
+                p.resolveContextKinds
+                    ?.map(checkersMap::get)
+                    ?.mapNotNull {
+                        if (it == null) null else it to a
+                    }
             }
+            .flatMap { it.asSequence() }
             .mapNotNull { (kind, argument) ->
                 argument.resolveStringConstantValues()?.let { const ->
                     Triple(kind, argument, const)
diff --git a/tools/intellij-plugin/src/main/kotlin/net/mamoe/mirai/console/intellij/diagnostics/PluginDataValuesChecker.kt b/tools/intellij-plugin/src/main/kotlin/net/mamoe/mirai/console/intellij/diagnostics/PluginDataValuesChecker.kt
index 4130b6ce3..862e29d89 100644
--- a/tools/intellij-plugin/src/main/kotlin/net/mamoe/mirai/console/intellij/diagnostics/PluginDataValuesChecker.kt
+++ b/tools/intellij-plugin/src/main/kotlin/net/mamoe/mirai/console/intellij/diagnostics/PluginDataValuesChecker.kt
@@ -31,12 +31,12 @@ class PluginDataValuesChecker : DeclarationChecker {
         declaration.resolveAllCallsWithElement(bindingContext)
             .filter { (call) -> call.isCalling(PLUGIN_DATA_VALUE_FUNCTIONS_FQ_FQ_NAME) }
             .filter { (call) ->
-                call.resultingDescriptor.resolveContextKind == ResolveContextKind.RESTRICTED_NO_ARG_CONSTRUCTOR
+                call.resultingDescriptor.resolveContextKinds?.contains(ResolveContextKind.RESTRICTED_NO_ARG_CONSTRUCTOR) == true
             }.flatMap { (call, element) ->
                 call.typeArguments.entries.associateWith { element }.asSequence()
             }.filter { (e, _) ->
                 val (p, t) = e
-                (p.isReified || p.resolveContextKind == ResolveContextKind.RESTRICTED_NO_ARG_CONSTRUCTOR)
+                (p.isReified || p.resolveContextKinds?.contains(ResolveContextKind.RESTRICTED_NO_ARG_CONSTRUCTOR) == true)
                     && t is SimpleType
             }.forEach { (e, callExpr) ->
                 val (_, type) = e
diff --git a/tools/intellij-plugin/src/main/kotlin/net/mamoe/mirai/console/intellij/diagnostics/diagnosticsUtil.kt b/tools/intellij-plugin/src/main/kotlin/net/mamoe/mirai/console/intellij/diagnostics/diagnosticsUtil.kt
index 6fd2874b4..1c7d4911f 100644
--- a/tools/intellij-plugin/src/main/kotlin/net/mamoe/mirai/console/intellij/diagnostics/diagnosticsUtil.kt
+++ b/tools/intellij-plugin/src/main/kotlin/net/mamoe/mirai/console/intellij/diagnostics/diagnosticsUtil.kt
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.diagnostics.Diagnostic
 import org.jetbrains.kotlin.psi.KtElement
 import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
 import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext
-import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
 
 fun DeclarationCheckerContext.report(diagnostic: Diagnostic) {
     return this.trace.report(diagnostic)
@@ -25,7 +24,6 @@ val DeclarationCheckerContext.bindingContext get() = this.trace.bindingContext
 
 fun KtElement?.getResolvedCallOrResolveToCall(
     context: DeclarationCheckerContext,
-    bodyResolveMode: BodyResolveMode = BodyResolveMode.PARTIAL,
 ): ResolvedCall<out CallableDescriptor>? {
-    return this.getResolvedCallOrResolveToCall(context.bindingContext, bodyResolveMode)
+    return this.getResolvedCallOrResolveToCall(context.bindingContext)
 }
\ No newline at end of file
diff --git a/tools/intellij-plugin/src/main/kotlin/net/mamoe/mirai/console/intellij/resolve/resolveIdea.kt b/tools/intellij-plugin/src/main/kotlin/net/mamoe/mirai/console/intellij/resolve/resolveIdea.kt
index 723da4408..a8afeb64b 100644
--- a/tools/intellij-plugin/src/main/kotlin/net/mamoe/mirai/console/intellij/resolve/resolveIdea.kt
+++ b/tools/intellij-plugin/src/main/kotlin/net/mamoe/mirai/console/intellij/resolve/resolveIdea.kt
@@ -32,7 +32,6 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
 import org.jetbrains.kotlin.resolve.constants.ArrayValue
 import org.jetbrains.kotlin.resolve.constants.ConstantValue
 import org.jetbrains.kotlin.resolve.constants.StringValue
-import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
 import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
 
 
@@ -125,9 +124,8 @@ inline fun <reified E> PsiElement.findChild(): E? = this.children.find { it is E
 
 fun KtElement?.getResolvedCallOrResolveToCall(
     context: BindingContext,
-    bodyResolveMode: BodyResolveMode = BodyResolveMode.PARTIAL,
 ): ResolvedCall<out CallableDescriptor>? {
-    return this?.getCall(context)?.getResolvedCall(context)// ?: this?.resolveToCall(bodyResolveMode)
+    return this?.getCall(context)?.getResolvedCall(context)
 }
 
 val ResolvedCall<out CallableDescriptor>.valueParameters: List<ValueParameterDescriptor> get() = this.resultingDescriptor.valueParameters