From eaf4c6175d6bd7bd1643a322bc7e10ba3db057fd Mon Sep 17 00:00:00 2001 From: Nathan Adams Date: Thu, 20 Jul 2017 13:32:12 +0200 Subject: [PATCH] Keep nodes sorted alphabetically for niceness --- .../brigadier/arguments/ArgumentType.java | 10 ++++++++- .../arguments/IntegerArgumentType.java | 14 +++++++++---- .../arguments/StringArgumentType.java | 4 ---- .../brigadier/tree/ArgumentCommandNode.java | 15 ++++++++++++- .../mojang/brigadier/tree/CommandNode.java | 20 ++++++++++++++++-- .../brigadier/tree/LiteralCommandNode.java | 5 +++++ .../brigadier/tree/RootCommandNode.java | 5 +++++ .../CommandDispatcherCompletionsTest.java | 4 ++-- .../arguments/IntegerArgumentTypeTest.java | 21 +++++++++++++++++++ .../tree/ArgumentCommandNodeTest.java | 13 ++++++++++++ 10 files changed, 97 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/mojang/brigadier/arguments/ArgumentType.java b/src/main/java/com/mojang/brigadier/arguments/ArgumentType.java index f8d9743..7ce8650 100644 --- a/src/main/java/com/mojang/brigadier/arguments/ArgumentType.java +++ b/src/main/java/com/mojang/brigadier/arguments/ArgumentType.java @@ -9,5 +9,13 @@ import java.util.Set; public interface ArgumentType { ParsedArgument parse(String command, CommandContextBuilder contextBuilder) throws CommandException; - void listSuggestions(String command, Set output, CommandContextBuilder contextBuilder); + default void listSuggestions(String command, Set output, CommandContextBuilder contextBuilder) {} + + default String getUsageSuffix() { + return null; + } + + default String getUsageText() { + return null; + } } diff --git a/src/main/java/com/mojang/brigadier/arguments/IntegerArgumentType.java b/src/main/java/com/mojang/brigadier/arguments/IntegerArgumentType.java index 186cadc..fdf1b62 100644 --- a/src/main/java/com/mojang/brigadier/arguments/IntegerArgumentType.java +++ b/src/main/java/com/mojang/brigadier/arguments/IntegerArgumentType.java @@ -83,10 +83,6 @@ public class IntegerArgumentType implements ArgumentType { } } - @Override - public void listSuggestions(String command, Set output, CommandContextBuilder contextBuilder) { - } - @Override public boolean equals(Object o) { if (this == o) return true; @@ -111,4 +107,14 @@ public class IntegerArgumentType implements ArgumentType { return "integer(" + minimum + ", " + maximum + ")"; } } + + @Override + public String getUsageSuffix() { + return suffix.length() == 0 ? null : suffix; + } + + @Override + public String getUsageText() { + return "int"; + } } diff --git a/src/main/java/com/mojang/brigadier/arguments/StringArgumentType.java b/src/main/java/com/mojang/brigadier/arguments/StringArgumentType.java index df2ab2e..4f8095b 100644 --- a/src/main/java/com/mojang/brigadier/arguments/StringArgumentType.java +++ b/src/main/java/com/mojang/brigadier/arguments/StringArgumentType.java @@ -96,10 +96,6 @@ public class StringArgumentType implements ArgumentType { } } - @Override - public void listSuggestions(String command, Set output, CommandContextBuilder contextBuilder) { - } - @Override public String toString() { return "string()"; diff --git a/src/main/java/com/mojang/brigadier/tree/ArgumentCommandNode.java b/src/main/java/com/mojang/brigadier/tree/ArgumentCommandNode.java index a5a7209..d584c27 100644 --- a/src/main/java/com/mojang/brigadier/tree/ArgumentCommandNode.java +++ b/src/main/java/com/mojang/brigadier/tree/ArgumentCommandNode.java @@ -38,7 +38,15 @@ public class ArgumentCommandNode extends CommandNode { @Override public String getUsageText() { - return USAGE_ARGUMENT_OPEN + name + USAGE_ARGUMENT_CLOSE; + String usage = name; + if (type.getUsageText() != null) { + usage += ": " + type.getUsageText(); + } + usage = USAGE_ARGUMENT_OPEN + usage + USAGE_ARGUMENT_CLOSE; + if (type.getUsageSuffix() != null) { + usage += type.getUsageSuffix(); + } + return usage; } @Override @@ -89,4 +97,9 @@ public class ArgumentCommandNode extends CommandNode { result = 31 * result + type.hashCode(); return result; } + + @Override + protected String getSortedKey() { + return name; + } } diff --git a/src/main/java/com/mojang/brigadier/tree/CommandNode.java b/src/main/java/com/mojang/brigadier/tree/CommandNode.java index 8ab31c8..16c5a27 100644 --- a/src/main/java/com/mojang/brigadier/tree/CommandNode.java +++ b/src/main/java/com/mojang/brigadier/tree/CommandNode.java @@ -1,5 +1,6 @@ package com.mojang.brigadier.tree; +import com.google.common.collect.ComparisonChain; import com.google.common.collect.Maps; import com.mojang.brigadier.Command; import com.mojang.brigadier.builder.ArgumentBuilder; @@ -7,12 +8,14 @@ import com.mojang.brigadier.context.CommandContextBuilder; import com.mojang.brigadier.exceptions.CommandException; import java.util.Collection; +import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import java.util.function.Predicate; +import java.util.stream.Collectors; -public abstract class CommandNode { - private final Map> children = Maps.newLinkedHashMap(); +public abstract class CommandNode implements Comparable> { + private Map> children = Maps.newLinkedHashMap(); private Command command; private Predicate requirement; @@ -46,6 +49,8 @@ public abstract class CommandNode { } else { children.put(node.getMergeKey(), node); } + + children = children.entrySet().stream().sorted(Map.Entry.comparingByValue()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); } @Override @@ -79,4 +84,15 @@ public abstract class CommandNode { public abstract void listSuggestions(String command, Set output, CommandContextBuilder contextBuilder); public abstract ArgumentBuilder createBuilder(); + + protected abstract String getSortedKey(); + + @Override + public int compareTo(CommandNode o) { + return ComparisonChain + .start() + .compareTrueFirst(this instanceof LiteralCommandNode, o instanceof LiteralCommandNode) + .compare(getSortedKey(), o.getSortedKey()) + .result(); + } } diff --git a/src/main/java/com/mojang/brigadier/tree/LiteralCommandNode.java b/src/main/java/com/mojang/brigadier/tree/LiteralCommandNode.java index 02a4cfc..85fec97 100644 --- a/src/main/java/com/mojang/brigadier/tree/LiteralCommandNode.java +++ b/src/main/java/com/mojang/brigadier/tree/LiteralCommandNode.java @@ -81,4 +81,9 @@ public class LiteralCommandNode extends CommandNode { } return builder; } + + @Override + protected String getSortedKey() { + return literal; + } } diff --git a/src/main/java/com/mojang/brigadier/tree/RootCommandNode.java b/src/main/java/com/mojang/brigadier/tree/RootCommandNode.java index 9bff708..98620d0 100644 --- a/src/main/java/com/mojang/brigadier/tree/RootCommandNode.java +++ b/src/main/java/com/mojang/brigadier/tree/RootCommandNode.java @@ -41,4 +41,9 @@ public class RootCommandNode extends CommandNode { public ArgumentBuilder createBuilder() { throw new IllegalStateException("Cannot convert root into a builder"); } + + @Override + protected String getSortedKey() { + return ""; + } } diff --git a/src/test/java/com/mojang/brigadier/CommandDispatcherCompletionsTest.java b/src/test/java/com/mojang/brigadier/CommandDispatcherCompletionsTest.java index e6e2dc1..8895ed6 100644 --- a/src/test/java/com/mojang/brigadier/CommandDispatcherCompletionsTest.java +++ b/src/test/java/com/mojang/brigadier/CommandDispatcherCompletionsTest.java @@ -36,7 +36,7 @@ public class CommandDispatcherCompletionsTest { subject.register(literal("foo")); subject.register(literal("bar")); subject.register(literal("baz").requires(s -> false)); - assertThat(subject.getCompletionSuggestions("", source), equalTo(new String[] {"foo", "bar"})); + assertThat(subject.getCompletionSuggestions("", source), equalTo(new String[] {"bar", "foo"})); assertThat(subject.getCompletionSuggestions("f", source), equalTo(new String[] {"foo"})); assertThat(subject.getCompletionSuggestions("b", source), equalTo(new String[] {"bar"})); assertThat(subject.getCompletionSuggestions("q", source), is(emptyArray())); @@ -46,7 +46,7 @@ public class CommandDispatcherCompletionsTest { public void testSubCommand() throws Exception { subject.register(literal("foo").then(literal("abc")).then(literal("def")).then(literal("ghi").requires(s -> false))); subject.register(literal("bar")); - assertThat(subject.getCompletionSuggestions("", source), equalTo(new String[] {"foo", "bar"})); + assertThat(subject.getCompletionSuggestions("", source), equalTo(new String[] {"bar", "foo"})); assertThat(subject.getCompletionSuggestions("f", source), equalTo(new String[] {"foo"})); assertThat(subject.getCompletionSuggestions("foo", source), equalTo(new String[] {"foo"})); assertThat(subject.getCompletionSuggestions("foo ", source), equalTo(new String[] {"abc", "def"})); diff --git a/src/test/java/com/mojang/brigadier/arguments/IntegerArgumentTypeTest.java b/src/test/java/com/mojang/brigadier/arguments/IntegerArgumentTypeTest.java index e6e4fef..7e77360 100644 --- a/src/test/java/com/mojang/brigadier/arguments/IntegerArgumentTypeTest.java +++ b/src/test/java/com/mojang/brigadier/arguments/IntegerArgumentTypeTest.java @@ -19,6 +19,7 @@ import java.util.Set; import static com.mojang.brigadier.arguments.IntegerArgumentType.integer; import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasToString; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; @@ -202,4 +203,24 @@ public class IntegerArgumentTypeTest { assertThat(integer(-100, 100), hasToString("integer(-100, 100)")); assertThat(integer(Integer.MIN_VALUE, 100), hasToString("integer(-2147483648, 100)")); } + + @Test + public void testUsageSuffix() throws Exception { + assertThat(integer().getUsageSuffix(), equalTo(null)); + } + + @Test + public void testUsageSuffix_suffix() throws Exception { + assertThat(integer(0, 100, "L").getUsageSuffix(), equalTo("L")); + } + + @Test + public void testUsageText() throws Exception { + assertThat(integer().getUsageText(), equalTo("int")); + } + + @Test + public void testUsageText_suffix() throws Exception { + assertThat(integer(0, 100, "L").getUsageText(), equalTo("int")); + } } \ No newline at end of file diff --git a/src/test/java/com/mojang/brigadier/tree/ArgumentCommandNodeTest.java b/src/test/java/com/mojang/brigadier/tree/ArgumentCommandNodeTest.java index eb1fe27..cc05979 100644 --- a/src/test/java/com/mojang/brigadier/tree/ArgumentCommandNodeTest.java +++ b/src/test/java/com/mojang/brigadier/tree/ArgumentCommandNodeTest.java @@ -6,6 +6,7 @@ import com.google.common.testing.EqualsTester; import com.mojang.brigadier.Command; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.RequiredArgumentBuilder; import com.mojang.brigadier.context.CommandContextBuilder; import com.mojang.brigadier.exceptions.CommandException; @@ -68,6 +69,18 @@ public class ArgumentCommandNodeTest extends AbstractCommandNodeTest { @Test public void testUsage() throws Exception { + assertThat(node.getUsageText(), is("")); + } + + @Test + public void testUsage_suffix() throws Exception { + node = argument("foo", integer(0, 100, "L")).build(); + assertThat(node.getUsageText(), is("L")); + } + + @Test + public void testUsage_empty() throws Exception { + ArgumentCommandNode node = argument("foo", StringArgumentType.word()).build(); assertThat(node.getUsageText(), is("")); }