Fix error message for unknown parameters in KotlinAnnotatedMethods
This commit is contained in:
parent
8711d19703
commit
4eb3df1f57
2 changed files with 28 additions and 11 deletions
|
|
@ -57,6 +57,7 @@ public class MethodCommandExecutionHandler<C> implements CommandExecutionHandler
|
||||||
* Constructs a new method command execution handler
|
* Constructs a new method command execution handler
|
||||||
*
|
*
|
||||||
* @param context The context
|
* @param context The context
|
||||||
|
* @since 1.6.0
|
||||||
*/
|
*/
|
||||||
public MethodCommandExecutionHandler(
|
public MethodCommandExecutionHandler(
|
||||||
final @NonNull CommandMethodContext<C> context
|
final @NonNull CommandMethodContext<C> context
|
||||||
|
|
@ -76,9 +77,9 @@ public class MethodCommandExecutionHandler<C> implements CommandExecutionHandler
|
||||||
try {
|
try {
|
||||||
this.methodHandle.invokeWithArguments(
|
this.methodHandle.invokeWithArguments(
|
||||||
this.createParameterValues(
|
this.createParameterValues(
|
||||||
commandContext,
|
commandContext,
|
||||||
commandContext.flags(),
|
commandContext.flags(),
|
||||||
true
|
this.parameters
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
} catch (final Error e) {
|
} catch (final Error e) {
|
||||||
|
|
@ -89,20 +90,21 @@ public class MethodCommandExecutionHandler<C> implements CommandExecutionHandler
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a list containing the values for all method parameters
|
* Creates a list containing the values for the given method parameters.
|
||||||
*
|
*
|
||||||
* @param commandContext The context
|
* @param commandContext The context
|
||||||
* @param flagContext The flag context
|
* @param flagContext The flag context
|
||||||
* @param throwOnMissing Whether exceptions should be thrown on missing parameters
|
* @param parameters The parameters to create values for
|
||||||
* @return A list containing all parameters, in order
|
* @return A list containing all parameters, in order
|
||||||
|
* @since 1.6.0
|
||||||
*/
|
*/
|
||||||
protected final List<Object> createParameterValues(
|
protected final List<Object> createParameterValues(
|
||||||
final CommandContext<C> commandContext,
|
final CommandContext<C> commandContext,
|
||||||
final FlagContext flagContext,
|
final FlagContext flagContext,
|
||||||
final boolean throwOnMissing
|
final Parameter[] parameters
|
||||||
) {
|
) {
|
||||||
final List<Object> arguments = new ArrayList<>(this.parameters.length);
|
final List<Object> arguments = new ArrayList<>(parameters.length);
|
||||||
for (final Parameter parameter : this.parameters) {
|
for (final Parameter parameter : parameters) {
|
||||||
if (parameter.isAnnotationPresent(Argument.class)) {
|
if (parameter.isAnnotationPresent(Argument.class)) {
|
||||||
final Argument argument = parameter.getAnnotation(Argument.class);
|
final Argument argument = parameter.getAnnotation(Argument.class);
|
||||||
|
|
||||||
|
|
@ -138,10 +140,11 @@ public class MethodCommandExecutionHandler<C> implements CommandExecutionHandler
|
||||||
);
|
);
|
||||||
if (value.isPresent()) {
|
if (value.isPresent()) {
|
||||||
arguments.add(value.get());
|
arguments.add(value.get());
|
||||||
} else if (throwOnMissing) {
|
} else {
|
||||||
throw new IllegalArgumentException(String.format(
|
throw new IllegalArgumentException(String.format(
|
||||||
"Unknown command parameter '%s' in method '%s'",
|
"Could not create value for parameter '%s' of type '%s' in method '%s'",
|
||||||
parameter.getName(),
|
parameter.getName(),
|
||||||
|
parameter.getType().getTypeName(),
|
||||||
this.methodHandle.toString()
|
this.methodHandle.toString()
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
@ -155,6 +158,7 @@ public class MethodCommandExecutionHandler<C> implements CommandExecutionHandler
|
||||||
* Returns the command method context
|
* Returns the command method context
|
||||||
*
|
*
|
||||||
* @return The context
|
* @return The context
|
||||||
|
* @since 1.6.0
|
||||||
*/
|
*/
|
||||||
public @NonNull CommandMethodContext<C> context() {
|
public @NonNull CommandMethodContext<C> context() {
|
||||||
return this.context;
|
return this.context;
|
||||||
|
|
@ -164,6 +168,7 @@ public class MethodCommandExecutionHandler<C> implements CommandExecutionHandler
|
||||||
* Returns all parameters passed to the method
|
* Returns all parameters passed to the method
|
||||||
*
|
*
|
||||||
* @return The parameters
|
* @return The parameters
|
||||||
|
* @since 1.6.0
|
||||||
*/
|
*/
|
||||||
public final @NonNull Parameter @NonNull [] parameters() {
|
public final @NonNull Parameter @NonNull [] parameters() {
|
||||||
return this.parameters;
|
return this.parameters;
|
||||||
|
|
@ -173,6 +178,7 @@ public class MethodCommandExecutionHandler<C> implements CommandExecutionHandler
|
||||||
* Returns the compiled method handle for the command method.
|
* Returns the compiled method handle for the command method.
|
||||||
*
|
*
|
||||||
* @return The method handle
|
* @return The method handle
|
||||||
|
* @since 1.6.0
|
||||||
*/
|
*/
|
||||||
public final @NonNull MethodHandle methodHandle() {
|
public final @NonNull MethodHandle methodHandle() {
|
||||||
return this.methodHandle;
|
return this.methodHandle;
|
||||||
|
|
@ -182,6 +188,7 @@ public class MethodCommandExecutionHandler<C> implements CommandExecutionHandler
|
||||||
* The annotation accessor for the command method
|
* The annotation accessor for the command method
|
||||||
*
|
*
|
||||||
* @return Annotation accessor
|
* @return Annotation accessor
|
||||||
|
* @since 1.6.0
|
||||||
*/
|
*/
|
||||||
public final AnnotationAccessor annotationAccessor() {
|
public final AnnotationAccessor annotationAccessor() {
|
||||||
return this.annotationAccessor;
|
return this.annotationAccessor;
|
||||||
|
|
@ -191,6 +198,7 @@ public class MethodCommandExecutionHandler<C> implements CommandExecutionHandler
|
||||||
* Context for command methods
|
* Context for command methods
|
||||||
*
|
*
|
||||||
* @param <C> Command sender type
|
* @param <C> Command sender type
|
||||||
|
* @since 1.6.0
|
||||||
*/
|
*/
|
||||||
public static class CommandMethodContext<C> {
|
public static class CommandMethodContext<C> {
|
||||||
|
|
||||||
|
|
@ -216,6 +224,7 @@ public class MethodCommandExecutionHandler<C> implements CommandExecutionHandler
|
||||||
* The instance that owns the command method
|
* The instance that owns the command method
|
||||||
*
|
*
|
||||||
* @return The instance
|
* @return The instance
|
||||||
|
* @since 1.6.0
|
||||||
*/
|
*/
|
||||||
public @NonNull Object instance() {
|
public @NonNull Object instance() {
|
||||||
return this.instance;
|
return this.instance;
|
||||||
|
|
@ -225,6 +234,7 @@ public class MethodCommandExecutionHandler<C> implements CommandExecutionHandler
|
||||||
* The command method
|
* The command method
|
||||||
*
|
*
|
||||||
* @return The method
|
* @return The method
|
||||||
|
* @since 1.6.0
|
||||||
*/
|
*/
|
||||||
public final @NonNull Method method() {
|
public final @NonNull Method method() {
|
||||||
return this.method;
|
return this.method;
|
||||||
|
|
@ -234,6 +244,7 @@ public class MethodCommandExecutionHandler<C> implements CommandExecutionHandler
|
||||||
* The compiled command arguments
|
* The compiled command arguments
|
||||||
*
|
*
|
||||||
* @return Compiled command arguments
|
* @return Compiled command arguments
|
||||||
|
* @since 1.6.0
|
||||||
*/
|
*/
|
||||||
public final @NonNull Map<@NonNull String, @NonNull CommandArgument<C, ?>> commandArguments() {
|
public final @NonNull Map<@NonNull String, @NonNull CommandArgument<C, ?>> commandArguments() {
|
||||||
return this.commandArguments;
|
return this.commandArguments;
|
||||||
|
|
@ -243,6 +254,7 @@ public class MethodCommandExecutionHandler<C> implements CommandExecutionHandler
|
||||||
* The injector registry
|
* The injector registry
|
||||||
*
|
*
|
||||||
* @return Injector registry
|
* @return Injector registry
|
||||||
|
* @since 1.6.0
|
||||||
*/
|
*/
|
||||||
public final @NonNull ParameterInjectorRegistry<C> injectorRegistry() {
|
public final @NonNull ParameterInjectorRegistry<C> injectorRegistry() {
|
||||||
return this.injectorRegistry;
|
return this.injectorRegistry;
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ import java.lang.reflect.InvocationTargetException
|
||||||
import java.lang.reflect.Method
|
import java.lang.reflect.Method
|
||||||
import java.util.concurrent.CompletableFuture
|
import java.util.concurrent.CompletableFuture
|
||||||
import java.util.function.Predicate
|
import java.util.function.Predicate
|
||||||
|
import kotlin.coroutines.Continuation
|
||||||
import kotlin.coroutines.CoroutineContext
|
import kotlin.coroutines.CoroutineContext
|
||||||
import kotlin.coroutines.EmptyCoroutineContext
|
import kotlin.coroutines.EmptyCoroutineContext
|
||||||
import kotlin.reflect.full.callSuspend
|
import kotlin.reflect.full.callSuspend
|
||||||
|
|
@ -70,7 +71,11 @@ private class KotlinMethodCommandExecutionHandler<C>(
|
||||||
|
|
||||||
override fun executeFuture(commandContext: CommandContext<C>): CompletableFuture<Void?> {
|
override fun executeFuture(commandContext: CommandContext<C>): CompletableFuture<Void?> {
|
||||||
val instance = context().instance()
|
val instance = context().instance()
|
||||||
val params = createParameterValues(commandContext, commandContext.flags(), false)
|
val params = createParameterValues(
|
||||||
|
commandContext,
|
||||||
|
commandContext.flags(),
|
||||||
|
this.parameters().filterNot { Continuation::class.java == it.type }.toTypedArray()
|
||||||
|
)
|
||||||
|
|
||||||
// We need to propagate exceptions to the caller.
|
// We need to propagate exceptions to the caller.
|
||||||
return coroutineScope.future(this@KotlinMethodCommandExecutionHandler.coroutineContext) {
|
return coroutineScope.future(this@KotlinMethodCommandExecutionHandler.coroutineContext) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue