From ce2cd3d1bf75545ed8c945140a3295073abb3ad2 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Tue, 30 Mar 2021 16:08:51 +0200 Subject: [PATCH] Fix varArgs, fix help --- .../src/de/steamwar/command/SWCommand.java | 11 ++++- .../de/steamwar/command/SWCommandUtils.java | 41 +++++++++++-------- .../src/de/steamwar/command/SubCommand.java | 10 ++--- 3 files changed, 39 insertions(+), 23 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java index 8070f7d..cbfe7a1 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java @@ -135,7 +135,16 @@ public abstract class SWCommand { commandSet.add(new SubCommand(this, method, anno.value())); }); - commandSet.sort(Comparator.comparingInt(o -> -o.subCommand.length)); + this.commandSet.sort((o1, o2) -> { + int compare = Integer.compare(-o1.subCommand.length, -o2.subCommand.length); + if (compare != 0) { + return compare; + } else { + int i1 = o1.varArgType != null ? Integer.MAX_VALUE : o1.arguments.length; + int i2 = o2.varArgType != null ? Integer.MAX_VALUE : o2.arguments.length; + return Integer.compare(i1, i2); + } + }); commandHelpSet.sort(Comparator.comparingInt(o -> -o.subCommand.length)); } } diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java b/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java index 464517d..7fe7f41 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java @@ -110,26 +110,33 @@ public class SWCommandUtils { index++; } - for (int i = 0; i < parameters.length - (varArgType != null ? 1 : 0); i++) { - arguments[i + 1] = parameters[i].map(args[index]); - index++; - if (arguments[i + 1] == null) { - throw new CommandParseException(); - } - } - - if (varArgType != null) { - int length = args.length - parameters.length + 1; - Object varArgument = Array.newInstance(varArgType, length); + if (varArgType != null && index > args.length - 1) { + Object varArgument = Array.newInstance(varArgType, 0); arguments[arguments.length - 1] = varArgument; - - for (int i = 0; i < length; i++) { - Object value = parameters[parameters.length - 1].map(args[index]); - if (value == null) { + } else { + for (int i = 0; i < parameters.length - (varArgType != null ? 1 : 0); i++) { + System.out.println(index); + arguments[i + 1] = parameters[i].map(args[index]); + System.out.println(arguments[i + 1]); + index++; + if (arguments[i + 1] == null) { throw new CommandParseException(); } - Array.set(varArgument, i, value); - index++; + } + + if (varArgType != null) { + int length = args.length - parameters.length - subCommand.length + 1; + Object varArgument = Array.newInstance(varArgType, length); + arguments[arguments.length - 1] = varArgument; + + for (int i = 0; i < length; i++) { + Object value = parameters[parameters.length - 1].map(args[index]); + if (value == null) { + throw new CommandParseException(); + } + Array.set(varArgument, i, value); + index++; + } } } return arguments; diff --git a/SpigotCore_Main/src/de/steamwar/command/SubCommand.java b/SpigotCore_Main/src/de/steamwar/command/SubCommand.java index ad359a3..e4229b6 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SubCommand.java +++ b/SpigotCore_Main/src/de/steamwar/command/SubCommand.java @@ -32,9 +32,9 @@ class SubCommand { private SWCommand swCommand; private Method method; String[] subCommand; - private TypeMapper[] arguments; + TypeMapper[] arguments; private Function commandSenderFunction; - private Class varArgType = null; + Class varArgType = null; public SubCommand(SWCommand swCommand, Method method, String[] subCommand) { this(swCommand, method, subCommand, new HashMap<>()); @@ -81,10 +81,10 @@ class SubCommand { } boolean invoke(CommandSender commandSender, String[] args) { - if (args.length < arguments.length - 1) { + if (args.length < arguments.length + subCommand.length - (varArgType != null ? 1 : 0)) { return false; } - if (varArgType == null && args.length > arguments.length) { + if (varArgType == null && args.length > arguments.length + subCommand.length) { return false; } try { @@ -101,7 +101,7 @@ class SubCommand { } List tabComplete(CommandSender commandSender, String[] args) { - if (varArgType == null && args.length < arguments.length - 1) { + if (varArgType == null && args.length < arguments.length + subCommand.length - 1) { return null; } List argsList = new LinkedList<>(Arrays.asList(args));