mirror of
https://github.com/mamoe/mirai.git
synced 2025-02-04 14:05:00 +08:00
Merge remote-tracking branch 'origin/master' into logger
This commit is contained in:
commit
7d36bc6f7d
@ -22,6 +22,7 @@ import net.mamoe.mirai.console.util.ConsoleExperimentalApi
|
|||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
import kotlin.reflect.KFunction
|
import kotlin.reflect.KFunction
|
||||||
import kotlin.reflect.KType
|
import kotlin.reflect.KType
|
||||||
|
import kotlin.reflect.full.isSubclassOf
|
||||||
import kotlin.reflect.full.isSubtypeOf
|
import kotlin.reflect.full.isSubtypeOf
|
||||||
import kotlin.reflect.typeOf
|
import kotlin.reflect.typeOf
|
||||||
|
|
||||||
@ -183,9 +184,13 @@ public class CommandReceiverParameter<T : CommandSender>(
|
|||||||
override val name: String get() = PARAMETER_NAME
|
override val name: String get() = PARAMETER_NAME
|
||||||
|
|
||||||
init {
|
init {
|
||||||
check(type.classifier is KClass<*>) {
|
val classifier = type.classifier
|
||||||
|
require(classifier is KClass<*>) {
|
||||||
"CommandReceiverParameter.type.classifier must be KClass."
|
"CommandReceiverParameter.type.classifier must be KClass."
|
||||||
}
|
}
|
||||||
|
require(classifier.isSubclassOf(CommandSender::class)) {
|
||||||
|
"CommandReceiverParameter.type.classifier must be subclass of CommandSender."
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public companion object {
|
public companion object {
|
||||||
|
@ -29,13 +29,20 @@ public open class NoValueArgumentMappingException(
|
|||||||
public val forType: KType,
|
public val forType: KType,
|
||||||
) : CommandResolutionException("Cannot find a CommandArgument mapping for ${forType.qualifiedName}")
|
) : CommandResolutionException("Cannot find a CommandArgument mapping for ${forType.qualifiedName}")
|
||||||
|
|
||||||
|
public open class CommandResolutionException : RuntimeException {
|
||||||
|
public constructor() : super()
|
||||||
|
public constructor(message: String?) : super(message)
|
||||||
|
public constructor(message: String?, cause: Throwable?) : super(message, cause)
|
||||||
|
public constructor(cause: Throwable?) : super(cause)
|
||||||
|
}
|
||||||
|
|
||||||
@ExperimentalCommandDescriptors
|
@ExperimentalCommandDescriptors
|
||||||
public open class CommandDeclarationClashException(
|
public open class CommandDeclarationClashException(
|
||||||
public val command: Command,
|
public val command: Command,
|
||||||
public val signatures: List<CommandSignature>,
|
public val signatures: List<CommandSignature>,
|
||||||
) : CommandResolutionException("Command declaration clash: \n${signatures.joinToString("\n")}")
|
) : CommandDeclarationException("Declaration clash for command '${command.primaryName}': \n${signatures.joinToString("\n")}")
|
||||||
|
|
||||||
public open class CommandResolutionException : RuntimeException {
|
public open class CommandDeclarationException : RuntimeException {
|
||||||
public constructor() : super()
|
public constructor() : super()
|
||||||
public constructor(message: String?) : super(message)
|
public constructor(message: String?) : super(message)
|
||||||
public constructor(message: String?, cause: Throwable?) : super(message, cause)
|
public constructor(message: String?, cause: Throwable?) : super(message, cause)
|
||||||
|
@ -2,12 +2,15 @@ package net.mamoe.mirai.console.command.resolve
|
|||||||
|
|
||||||
import net.mamoe.mirai.console.command.Command
|
import net.mamoe.mirai.console.command.Command
|
||||||
import net.mamoe.mirai.console.command.CommandManager
|
import net.mamoe.mirai.console.command.CommandManager
|
||||||
|
import net.mamoe.mirai.console.command.CommandSender
|
||||||
import net.mamoe.mirai.console.command.descriptor.*
|
import net.mamoe.mirai.console.command.descriptor.*
|
||||||
import net.mamoe.mirai.console.command.descriptor.ArgumentAcceptance.Companion.isNotAcceptable
|
import net.mamoe.mirai.console.command.descriptor.ArgumentAcceptance.Companion.isNotAcceptable
|
||||||
import net.mamoe.mirai.console.command.parse.CommandCall
|
import net.mamoe.mirai.console.command.parse.CommandCall
|
||||||
import net.mamoe.mirai.console.command.parse.CommandValueArgument
|
import net.mamoe.mirai.console.command.parse.CommandValueArgument
|
||||||
import net.mamoe.mirai.console.command.parse.DefaultCommandValueArgument
|
import net.mamoe.mirai.console.command.parse.DefaultCommandValueArgument
|
||||||
import net.mamoe.mirai.console.extensions.CommandCallResolverProvider
|
import net.mamoe.mirai.console.extensions.CommandCallResolverProvider
|
||||||
|
import net.mamoe.mirai.console.extensions.CommandCallResolverProviderImpl
|
||||||
|
import net.mamoe.mirai.console.internal.data.classifierAsKClass
|
||||||
import net.mamoe.mirai.console.util.ConsoleExperimentalApi
|
import net.mamoe.mirai.console.util.ConsoleExperimentalApi
|
||||||
import net.mamoe.mirai.console.util.safeCast
|
import net.mamoe.mirai.console.util.safeCast
|
||||||
import net.mamoe.mirai.message.data.EmptyMessageChain
|
import net.mamoe.mirai.message.data.EmptyMessageChain
|
||||||
@ -19,7 +22,7 @@ import net.mamoe.mirai.message.data.asMessageChain
|
|||||||
@ConsoleExperimentalApi
|
@ConsoleExperimentalApi
|
||||||
@ExperimentalCommandDescriptors
|
@ExperimentalCommandDescriptors
|
||||||
public object BuiltInCommandCallResolver : CommandCallResolver {
|
public object BuiltInCommandCallResolver : CommandCallResolver {
|
||||||
public object Provider : CommandCallResolverProvider(BuiltInCommandCallResolver)
|
public object Provider : CommandCallResolverProvider by CommandCallResolverProviderImpl(BuiltInCommandCallResolver)
|
||||||
|
|
||||||
override fun resolve(call: CommandCall): ResolvedCommandCall? {
|
override fun resolve(call: CommandCall): ResolvedCommandCall? {
|
||||||
val callee = CommandManager.matchCommand(call.calleeName) ?: return null
|
val callee = CommandManager.matchCommand(call.calleeName) ?: return null
|
||||||
@ -27,7 +30,7 @@ public object BuiltInCommandCallResolver : CommandCallResolver {
|
|||||||
val valueArguments = call.valueArguments
|
val valueArguments = call.valueArguments
|
||||||
val context = callee.safeCast<CommandArgumentContextAware>()?.context
|
val context = callee.safeCast<CommandArgumentContextAware>()?.context
|
||||||
|
|
||||||
val signature = resolveImpl(callee, valueArguments, context) ?: return null
|
val signature = resolveImpl(call.caller, callee, valueArguments, context) ?: return null
|
||||||
|
|
||||||
return ResolvedCommandCallImpl(call.caller,
|
return ResolvedCommandCallImpl(call.caller,
|
||||||
callee,
|
callee,
|
||||||
@ -51,14 +54,18 @@ public object BuiltInCommandCallResolver : CommandCallResolver {
|
|||||||
)
|
)
|
||||||
|
|
||||||
private fun resolveImpl(
|
private fun resolveImpl(
|
||||||
|
caller: CommandSender,
|
||||||
callee: Command,
|
callee: Command,
|
||||||
valueArguments: List<CommandValueArgument>,
|
valueArguments: List<CommandValueArgument>,
|
||||||
context: CommandArgumentContext?,
|
context: CommandArgumentContext?,
|
||||||
): ResolveData? {
|
): ResolveData? {
|
||||||
|
|
||||||
|
|
||||||
callee.overloads
|
callee.overloads
|
||||||
.mapNotNull l@{ signature ->
|
.mapNotNull l@{ signature ->
|
||||||
|
if (signature.receiverParameter?.type?.classifierAsKClass()?.isInstance(caller) == false) {
|
||||||
|
return@l null // not compatible receiver
|
||||||
|
}
|
||||||
|
|
||||||
val valueParameters = signature.valueParameters
|
val valueParameters = signature.valueParameters
|
||||||
|
|
||||||
val zipped = valueParameters.zip(valueArguments).toMutableList()
|
val zipped = valueParameters.zip(valueArguments).toMutableList()
|
||||||
|
@ -11,6 +11,7 @@ package net.mamoe.mirai.console.extension
|
|||||||
|
|
||||||
import net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors
|
import net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors
|
||||||
import net.mamoe.mirai.console.command.parse.CommandCallParser
|
import net.mamoe.mirai.console.command.parse.CommandCallParser
|
||||||
|
import net.mamoe.mirai.console.command.resolve.CommandCallResolver
|
||||||
import net.mamoe.mirai.console.extensions.*
|
import net.mamoe.mirai.console.extensions.*
|
||||||
import net.mamoe.mirai.console.internal.extension.AbstractConcurrentComponentStorage
|
import net.mamoe.mirai.console.internal.extension.AbstractConcurrentComponentStorage
|
||||||
import net.mamoe.mirai.console.permission.PermissionService
|
import net.mamoe.mirai.console.permission.PermissionService
|
||||||
@ -77,7 +78,7 @@ public class PluginComponentStorage(
|
|||||||
/** 注册一个 [PermissionServiceProvider] */
|
/** 注册一个 [PermissionServiceProvider] */
|
||||||
@OverloadResolutionByLambdaReturnType
|
@OverloadResolutionByLambdaReturnType
|
||||||
public fun contributePermissionService(lazyInstance: () -> PermissionService<*>): Unit =
|
public fun contributePermissionService(lazyInstance: () -> PermissionService<*>): Unit =
|
||||||
contribute(PermissionServiceProvider, plugin, LazyPermissionServiceProviderImpl(lazyInstance))
|
contribute(PermissionServiceProvider, plugin, PermissionServiceProviderImplLazy(lazyInstance))
|
||||||
|
|
||||||
/** 注册一个 [PermissionServiceProvider] */
|
/** 注册一个 [PermissionServiceProvider] */
|
||||||
@JvmName("contributePermissionServiceProvider")
|
@JvmName("contributePermissionServiceProvider")
|
||||||
@ -90,7 +91,7 @@ public class PluginComponentStorage(
|
|||||||
/** 注册一个 [PluginLoaderProvider] */
|
/** 注册一个 [PluginLoaderProvider] */
|
||||||
@OverloadResolutionByLambdaReturnType
|
@OverloadResolutionByLambdaReturnType
|
||||||
public fun contributePluginLoader(lazyInstance: () -> PluginLoader<*, *>): Unit =
|
public fun contributePluginLoader(lazyInstance: () -> PluginLoader<*, *>): Unit =
|
||||||
contribute(PluginLoaderProvider, plugin, LazyPluginLoaderProviderImpl(lazyInstance))
|
contribute(PluginLoaderProvider, plugin, PluginLoaderProviderImplLazy(lazyInstance))
|
||||||
|
|
||||||
/** 注册一个 [PluginLoaderProvider] */
|
/** 注册一个 [PluginLoaderProvider] */
|
||||||
@JvmName("contributePluginLoaderProvider")
|
@JvmName("contributePluginLoaderProvider")
|
||||||
@ -104,7 +105,7 @@ public class PluginComponentStorage(
|
|||||||
@ExperimentalCommandDescriptors
|
@ExperimentalCommandDescriptors
|
||||||
@OverloadResolutionByLambdaReturnType
|
@OverloadResolutionByLambdaReturnType
|
||||||
public fun contributeCommandCallParser(lazyInstance: () -> CommandCallParser): Unit =
|
public fun contributeCommandCallParser(lazyInstance: () -> CommandCallParser): Unit =
|
||||||
contribute(CommandCallParserProvider, plugin, LazyCommandCallParserProviderImpl(lazyInstance))
|
contribute(CommandCallParserProvider, plugin, CommandCallParserProviderImplLazy(lazyInstance))
|
||||||
|
|
||||||
/** 注册一个 [CommandCallParserProvider] */
|
/** 注册一个 [CommandCallParserProvider] */
|
||||||
@ExperimentalCommandDescriptors
|
@ExperimentalCommandDescriptors
|
||||||
@ -112,4 +113,19 @@ public class PluginComponentStorage(
|
|||||||
@OverloadResolutionByLambdaReturnType
|
@OverloadResolutionByLambdaReturnType
|
||||||
public fun contributeCommandCallParser(provider: CommandCallParserProvider): Unit =
|
public fun contributeCommandCallParser(provider: CommandCallParserProvider): Unit =
|
||||||
contribute(CommandCallParserProvider, plugin, provider)
|
contribute(CommandCallParserProvider, plugin, provider)
|
||||||
|
|
||||||
|
/////////////////////////////////////
|
||||||
|
|
||||||
|
/** 注册一个 [CommandCallResolverProvider] */
|
||||||
|
@ExperimentalCommandDescriptors
|
||||||
|
@OverloadResolutionByLambdaReturnType
|
||||||
|
public fun contributeCommandCallResolver(lazyInstance: () -> CommandCallResolver): Unit =
|
||||||
|
contribute(CommandCallResolverProvider, plugin, CommandCallResolverProviderImplLazy(lazyInstance))
|
||||||
|
|
||||||
|
/** 注册一个 [CommandCallResolverProvider] */
|
||||||
|
@ExperimentalCommandDescriptors
|
||||||
|
@JvmName("contributeCommandCallResolverProvider")
|
||||||
|
@OverloadResolutionByLambdaReturnType
|
||||||
|
public fun contributeCommandCallParser(provider: CommandCallResolverProvider): Unit =
|
||||||
|
contribute(CommandCallResolverProvider, plugin, provider)
|
||||||
}
|
}
|
@ -30,6 +30,6 @@ public interface CommandCallParserProvider : InstanceExtension<CommandCallParser
|
|||||||
public class CommandCallParserProviderImpl(override val instance: CommandCallParser) : CommandCallParserProvider
|
public class CommandCallParserProviderImpl(override val instance: CommandCallParser) : CommandCallParserProvider
|
||||||
|
|
||||||
@ExperimentalCommandDescriptors
|
@ExperimentalCommandDescriptors
|
||||||
public class LazyCommandCallParserProviderImpl(instanceCalculator: () -> CommandCallParser) : CommandCallParserProvider {
|
public class CommandCallParserProviderImplLazy(instanceCalculator: () -> CommandCallParser) : CommandCallParserProvider {
|
||||||
override val instance: CommandCallParser by lazy(instanceCalculator)
|
override val instance: CommandCallParser by lazy(instanceCalculator)
|
||||||
}
|
}
|
@ -16,8 +16,16 @@ import net.mamoe.mirai.console.extension.AbstractInstanceExtensionPoint
|
|||||||
import net.mamoe.mirai.console.extension.InstanceExtension
|
import net.mamoe.mirai.console.extension.InstanceExtension
|
||||||
|
|
||||||
@ExperimentalCommandDescriptors
|
@ExperimentalCommandDescriptors
|
||||||
public open class CommandCallResolverProvider(override val instance: CommandCallResolver) : InstanceExtension<CommandCallResolver> {
|
public interface CommandCallResolverProvider : InstanceExtension<CommandCallResolver> {
|
||||||
public companion object ExtensionPoint :
|
public companion object ExtensionPoint :
|
||||||
AbstractInstanceExtensionPoint<CommandCallResolverProvider, CommandCallResolver>(CommandCallResolverProvider::class,
|
AbstractInstanceExtensionPoint<CommandCallResolverProvider, CommandCallResolver>(CommandCallResolverProvider::class,
|
||||||
BuiltInCommandCallResolver.Provider)
|
BuiltInCommandCallResolver.Provider)
|
||||||
|
}
|
||||||
|
|
||||||
|
@ExperimentalCommandDescriptors
|
||||||
|
public class CommandCallResolverProviderImpl(override val instance: CommandCallResolver) : CommandCallResolverProvider
|
||||||
|
|
||||||
|
@ExperimentalCommandDescriptors
|
||||||
|
public class CommandCallResolverProviderImplLazy(instanceCalculator: () -> CommandCallResolver) : CommandCallResolverProvider {
|
||||||
|
override val instance: CommandCallResolver by lazy(instanceCalculator)
|
||||||
}
|
}
|
@ -32,6 +32,6 @@ public class PermissionServiceProviderImpl(override val instance: PermissionServ
|
|||||||
/**
|
/**
|
||||||
* @see PermissionServiceProvider
|
* @see PermissionServiceProvider
|
||||||
*/
|
*/
|
||||||
public class LazyPermissionServiceProviderImpl(initializer: () -> PermissionService<*>) : PermissionServiceProvider {
|
public class PermissionServiceProviderImplLazy(initializer: () -> PermissionService<*>) : PermissionServiceProvider {
|
||||||
override val instance: PermissionService<*> by lazy(initializer)
|
override val instance: PermissionService<*> by lazy(initializer)
|
||||||
}
|
}
|
@ -24,7 +24,7 @@ import net.mamoe.mirai.console.plugin.loader.PluginLoader
|
|||||||
* @see Extension
|
* @see Extension
|
||||||
* @see PluginLoader
|
* @see PluginLoader
|
||||||
*
|
*
|
||||||
* @see LazyPluginLoaderProviderImpl
|
* @see PluginLoaderProviderImplLazy
|
||||||
*/
|
*/
|
||||||
public interface PluginLoaderProvider : InstanceExtension<PluginLoader<*, *>> {
|
public interface PluginLoaderProvider : InstanceExtension<PluginLoader<*, *>> {
|
||||||
public companion object ExtensionPoint : AbstractExtensionPoint<PluginLoaderProvider>(PluginLoaderProvider::class)
|
public companion object ExtensionPoint : AbstractExtensionPoint<PluginLoaderProvider>(PluginLoaderProvider::class)
|
||||||
@ -32,6 +32,6 @@ public interface PluginLoaderProvider : InstanceExtension<PluginLoader<*, *>> {
|
|||||||
|
|
||||||
public class PluginLoaderProviderImpl(override val instance: PluginLoader<*, *>) : PluginLoaderProvider
|
public class PluginLoaderProviderImpl(override val instance: PluginLoader<*, *>) : PluginLoaderProvider
|
||||||
|
|
||||||
public class LazyPluginLoaderProviderImpl(initializer: () -> PluginLoader<*, *>) : PluginLoaderProvider {
|
public class PluginLoaderProviderImplLazy(initializer: () -> PluginLoader<*, *>) : PluginLoaderProvider {
|
||||||
override val instance: PluginLoader<*, *> by lazy(initializer)
|
override val instance: PluginLoader<*, *> by lazy(initializer)
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user