From 99be06f571c1e8e4ab9869b6aae5a5191353fc5c Mon Sep 17 00:00:00 2001 From: themode Date: Sat, 20 Feb 2021 19:18:28 +0100 Subject: [PATCH] Revert to check shared command arguments --- .../server/command/CommandManager.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/main/java/net/minestom/server/command/CommandManager.java b/src/main/java/net/minestom/server/command/CommandManager.java index ab46f8cc4..c895a1eb2 100644 --- a/src/main/java/net/minestom/server/command/CommandManager.java +++ b/src/main/java/net/minestom/server/command/CommandManager.java @@ -432,6 +432,11 @@ public final class CommandManager { final int literalNodeId = addCommandNameNode(literalNode, rootChildren, nodes); + // Contains the arguments of the already-parsed syntaxes + List[]> syntaxesArguments = new ArrayList<>(); + // Contains the nodes of an argument + Map, List> storedArgumentsNodes = new HashMap<>(); + // Sort syntaxes by argument count. Brigadier requires it. syntaxes = syntaxes.stream().sorted(Comparator.comparingInt(o -> -o.getArguments().length)).collect(Collectors.toList()); for (CommandSyntax syntax : syntaxes) { @@ -455,12 +460,33 @@ public final class CommandManager { final Argument argument = arguments[i]; final boolean isLast = i == arguments.length - 1; + // Search previously parsed syntaxes to find identical part in order to create a node between those + { + // Find shared part + boolean foundSharedPart = false; + for (Argument[] parsedArguments : syntaxesArguments) { + final int index = i + 1; + if (ArrayUtils.sameStart(arguments, parsedArguments, index)) { + final Argument sharedArgument = parsedArguments[i]; + final List storedNodes = storedArgumentsNodes.get(sharedArgument); + + argChildren = new IntArrayList(); + lastNodes = storedNodes.get(index); + foundSharedPart = true; + } + } + if (foundSharedPart) { + continue; + } + } + // Process the nodes for the argument { argument.processNodes(nodeMaker, isLast); // Each node array represent a layer final List nodesLayer = nodeMaker.getNodes(); + storedArgumentsNodes.put(argument, nodesLayer); for (int nodeIndex = lastArgumentNodeIndex; nodeIndex < nodesLayer.size(); nodeIndex++) { final NodeMaker.ConfiguredNodes configuredNodes = nodeMaker.getConfiguredNodes().get(nodeIndex); final NodeMaker.Options options = configuredNodes.getOptions(); @@ -497,6 +523,7 @@ public final class CommandManager { lastArgumentNodeIndex = nodesLayer.size(); } } + syntaxesArguments.add(arguments); } literalNode.children = ArrayUtils.toArray(cmdChildren);