diff options
author | Dico200 <dico.karssiens@gmail.com> | 2018-07-26 17:21:26 +0100 |
---|---|---|
committer | Dico200 <dico.karssiens@gmail.com> | 2018-07-26 17:21:26 +0100 |
commit | bf1da033703f1343cfc54c61f8ace1fea7dbac25 (patch) | |
tree | 4ce40ade58bece02a6ef84f41b97d8940f22e471 /dicore3/command/src/main/java/io/dico/dicore/command/registration/reflect/ReflectiveRegistration.java | |
parent | c0e4ab728edcfc7415039ec5806c984521a65338 (diff) |
Improve async command approach - use coroutines correctly
Diffstat (limited to 'dicore3/command/src/main/java/io/dico/dicore/command/registration/reflect/ReflectiveRegistration.java')
-rw-r--r-- | dicore3/command/src/main/java/io/dico/dicore/command/registration/reflect/ReflectiveRegistration.java | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/registration/reflect/ReflectiveRegistration.java b/dicore3/command/src/main/java/io/dico/dicore/command/registration/reflect/ReflectiveRegistration.java index 84bb10b..0003c1f 100644 --- a/dicore3/command/src/main/java/io/dico/dicore/command/registration/reflect/ReflectiveRegistration.java +++ b/dicore3/command/src/main/java/io/dico/dicore/command/registration/reflect/ReflectiveRegistration.java @@ -197,10 +197,20 @@ public class ReflectiveRegistration { static int parseCommandAttributes(IParameterTypeSelector selector, Method method, ReflectiveCommand command, java.lang.reflect.Parameter[] parameters) throws CommandParseException { ParameterList list = command.getParameterList(); + boolean hasReceiverParameter = false; boolean hasSenderParameter = false; int start = 0; Class<?> firstParameterType = null; - if (parameters.length > start && CommandSender.class.isAssignableFrom(firstParameterType = parameters[0].getType())) { + Class<?> senderParameterType = null; + + if (parameters.length > start + && command.getInstance() instanceof ICommandReceiver.Factory + && ICommandReceiver.class.isAssignableFrom(firstParameterType = parameters[start].getType())) { + hasReceiverParameter = true; + start++; + } + + if (parameters.length > start && CommandSender.class.isAssignableFrom(senderParameterType = parameters[start].getType())) { hasSenderParameter = true; start++; } @@ -212,12 +222,17 @@ public class ReflectiveRegistration { } String[] parameterNames = lookupParameterNames(method, parameters, start); - command.setParameterOrder(parameterNames); - for (int i = start, n = parameters.length; i < n; i++) { + if (parameters[i].getType().getName().equals("kotlin.coroutines.experimental.Continuation")) { + List<String> temp = new ArrayList<>(Arrays.asList(parameterNames)); + temp.remove(i - start); + parameterNames = temp.toArray(new String[0]); + continue; + } Parameter<?, ?> parameter = parseParameter(selector, method, parameters[i], parameterNames[i - start]); list.addParameter(parameter); } + command.setParameterOrder(parameterNames); RequirePermissions cmdPermissions = method.getAnnotation(RequirePermissions.class); if (cmdPermissions != null) { @@ -257,9 +272,9 @@ public class ReflectiveRegistration { command.setDescription(); } - if (hasSenderParameter && Player.class.isAssignableFrom(firstParameterType)) { + if (hasSenderParameter && Player.class.isAssignableFrom(senderParameterType)) { command.addContextFilter(IContextFilter.PLAYER_ONLY); - } else if (hasSenderParameter && ConsoleCommandSender.class.isAssignableFrom(firstParameterType)) { + } else if (hasSenderParameter && ConsoleCommandSender.class.isAssignableFrom(senderParameterType)) { command.addContextFilter(IContextFilter.CONSOLE_ONLY); } else if (method.isAnnotationPresent(RequirePlayer.class)) { command.addContextFilter(IContextFilter.PLAYER_ONLY); @@ -269,7 +284,7 @@ public class ReflectiveRegistration { list.setRepeatFinalParameter(parameters.length > start && parameters[parameters.length - 1].isVarArgs()); list.setFinalParameterMayBeFlag(true); - return (hasSenderParameter ? 1 : 0) | (hasContextParameter ? 2 : 0); + return (hasSenderParameter ? 2 : 0) | (hasContextParameter ? 4 : 0) | (hasReceiverParameter ? 1 : 0); } public static int parseCommandAttributes(IParameterTypeSelector selector, Method method, ReflectiveCommand command) throws CommandParseException { |