summaryrefslogtreecommitdiff
path: root/dicore3/command/src/main/java/io/dico/dicore/command/registration/reflect/ReflectiveRegistration.java
diff options
context:
space:
mode:
authorDico200 <dico.karssiens@gmail.com>2018-07-26 17:21:26 +0100
committerDico200 <dico.karssiens@gmail.com>2018-07-26 17:21:26 +0100
commitbf1da033703f1343cfc54c61f8ace1fea7dbac25 (patch)
tree4ce40ade58bece02a6ef84f41b97d8940f22e471 /dicore3/command/src/main/java/io/dico/dicore/command/registration/reflect/ReflectiveRegistration.java
parentc0e4ab728edcfc7415039ec5806c984521a65338 (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.java27
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 {