diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/parse/CommandValueArgument.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/parse/CommandValueArgument.kt index 3f1f0e1a7..b20c14e00 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/parse/CommandValueArgument.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/parse/CommandValueArgument.kt @@ -7,6 +7,8 @@ * https://github.com/mamoe/mirai/blob/master/LICENSE */ +@file:Suppress("unused") + package net.mamoe.mirai.console.command.parse import net.mamoe.mirai.console.command.descriptor.* @@ -74,8 +76,8 @@ public fun CommandValueArgument.mapToTypeOrNull(expectingType: KType): T? { @OptIn(ExperimentalStdlibApi::class) val result = typeVariants .filter { it.outType.isSubtypeOf(expectingType) } - .also { - if (it.isEmpty()) return null + .ifEmpty { + return null } .reduce { acc, typeVariant -> if (acc.outType.isSubtypeOf(typeVariant.outType)) diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/resolve/BuiltInCommandCallResolver.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/resolve/BuiltInCommandCallResolver.kt index 280c05a22..d1cdf647e 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/resolve/BuiltInCommandCallResolver.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/resolve/BuiltInCommandCallResolver.kt @@ -25,7 +25,7 @@ public object BuiltInCommandCallResolver : CommandCallResolver { val signature = resolveImpl(callee, valueArguments, context) ?: return null - return ResolvedCommandCallImpl(call.caller, callee, signature, call.valueArguments) + return ResolvedCommandCallImpl(call.caller, callee, signature, call.valueArguments, context ?: EmptyCommandArgumentContext) } private data class ResolveData( diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/resolve/ResolvedCommandCall.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/resolve/ResolvedCommandCall.kt index 9639fc970..2feaa94f9 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/resolve/ResolvedCommandCall.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/resolve/ResolvedCommandCall.kt @@ -12,11 +12,14 @@ package net.mamoe.mirai.console.command.resolve import net.mamoe.mirai.console.command.Command import net.mamoe.mirai.console.command.CommandSender import net.mamoe.mirai.console.command.CompositeCommand +import net.mamoe.mirai.console.command.descriptor.CommandArgumentContext import net.mamoe.mirai.console.command.descriptor.CommandSignatureVariant import net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors +import net.mamoe.mirai.console.command.descriptor.NoValueArgumentMappingException import net.mamoe.mirai.console.command.parse.CommandCall import net.mamoe.mirai.console.command.parse.CommandValueArgument -import net.mamoe.mirai.console.command.parse.mapToType +import net.mamoe.mirai.console.command.parse.mapToTypeOrNull +import net.mamoe.mirai.console.internal.data.classifierAsKClass import net.mamoe.mirai.console.util.ConsoleExperimentalApi import kotlin.LazyThreadSafetyMode.PUBLICATION @@ -65,10 +68,12 @@ public class ResolvedCommandCallImpl( override val callee: Command, override val calleeSignature: CommandSignatureVariant, override val rawValueArguments: List, + private val context: CommandArgumentContext, ) : ResolvedCommandCall { override val resolvedValueArguments: List by lazy(PUBLICATION) { calleeSignature.valueParameters.zip(rawValueArguments).map { (parameter, argument) -> - argument.mapToType(parameter.type) + argument.mapToTypeOrNull(parameter.type) ?: context[parameter.type.classifierAsKClass()]?.parse(argument.value, caller) + ?: throw NoValueArgumentMappingException(argument, parameter.type) // TODO: 2020/10/17 consider vararg and optional } } diff --git a/backend/mirai-console/src/test/kotlin/net/mamoe/mirai/console/command/TestCommand.kt b/backend/mirai-console/src/test/kotlin/net/mamoe/mirai/console/command/TestCommand.kt index 90e55be2a..76c680bbf 100644 --- a/backend/mirai-console/src/test/kotlin/net/mamoe/mirai/console/command/TestCommand.kt +++ b/backend/mirai-console/src/test/kotlin/net/mamoe/mirai/console/command/TestCommand.kt @@ -136,12 +136,13 @@ internal class TestCommand { @Test fun `executing command by string command`() = runBlocking { - TestCompositeCommand.register() - val result = withTesting { - assertSuccess(sender.executeCommand("/testComposite mute 1")) - } + TestCompositeCommand.withRegistration { + val result = withTesting { + assertSuccess(sender.executeCommand("/testComposite mute 1")) + } - assertEquals(1, result) + assertEquals(1, result) + } } @Test