Keep nodes sorted alphabetically for niceness
This commit is contained in:
parent
daea2d76d7
commit
eaf4c6175d
10 changed files with 97 additions and 14 deletions
|
@ -9,5 +9,13 @@ import java.util.Set;
|
||||||
public interface ArgumentType<T> {
|
public interface ArgumentType<T> {
|
||||||
<S> ParsedArgument<S, T> parse(String command, CommandContextBuilder<S> contextBuilder) throws CommandException;
|
<S> ParsedArgument<S, T> parse(String command, CommandContextBuilder<S> contextBuilder) throws CommandException;
|
||||||
|
|
||||||
<S> void listSuggestions(String command, Set<String> output, CommandContextBuilder<S> contextBuilder);
|
default <S> void listSuggestions(String command, Set<String> output, CommandContextBuilder<S> contextBuilder) {}
|
||||||
|
|
||||||
|
default String getUsageSuffix() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
default String getUsageText() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,10 +83,6 @@ public class IntegerArgumentType implements ArgumentType<Integer> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public <S> void listSuggestions(String command, Set<String> output, CommandContextBuilder<S> contextBuilder) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object o) {
|
public boolean equals(Object o) {
|
||||||
if (this == o) return true;
|
if (this == o) return true;
|
||||||
|
@ -111,4 +107,14 @@ public class IntegerArgumentType implements ArgumentType<Integer> {
|
||||||
return "integer(" + minimum + ", " + maximum + ")";
|
return "integer(" + minimum + ", " + maximum + ")";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUsageSuffix() {
|
||||||
|
return suffix.length() == 0 ? null : suffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUsageText() {
|
||||||
|
return "int";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,10 +96,6 @@ public class StringArgumentType implements ArgumentType<String> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public <S> void listSuggestions(String command, Set<String> output, CommandContextBuilder<S> contextBuilder) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "string()";
|
return "string()";
|
||||||
|
|
|
@ -38,7 +38,15 @@ public class ArgumentCommandNode<S, T> extends CommandNode<S> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getUsageText() {
|
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
|
@Override
|
||||||
|
@ -89,4 +97,9 @@ public class ArgumentCommandNode<S, T> extends CommandNode<S> {
|
||||||
result = 31 * result + type.hashCode();
|
result = 31 * result + type.hashCode();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getSortedKey() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.mojang.brigadier.tree;
|
package com.mojang.brigadier.tree;
|
||||||
|
|
||||||
|
import com.google.common.collect.ComparisonChain;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import com.mojang.brigadier.Command;
|
import com.mojang.brigadier.Command;
|
||||||
import com.mojang.brigadier.builder.ArgumentBuilder;
|
import com.mojang.brigadier.builder.ArgumentBuilder;
|
||||||
|
@ -7,12 +8,14 @@ import com.mojang.brigadier.context.CommandContextBuilder;
|
||||||
import com.mojang.brigadier.exceptions.CommandException;
|
import com.mojang.brigadier.exceptions.CommandException;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public abstract class CommandNode<S> {
|
public abstract class CommandNode<S> implements Comparable<CommandNode<S>> {
|
||||||
private final Map<Object, CommandNode<S>> children = Maps.newLinkedHashMap();
|
private Map<Object, CommandNode<S>> children = Maps.newLinkedHashMap();
|
||||||
private Command<S> command;
|
private Command<S> command;
|
||||||
private Predicate<S> requirement;
|
private Predicate<S> requirement;
|
||||||
|
|
||||||
|
@ -46,6 +49,8 @@ public abstract class CommandNode<S> {
|
||||||
} else {
|
} else {
|
||||||
children.put(node.getMergeKey(), node);
|
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
|
@Override
|
||||||
|
@ -79,4 +84,15 @@ public abstract class CommandNode<S> {
|
||||||
public abstract void listSuggestions(String command, Set<String> output, CommandContextBuilder<S> contextBuilder);
|
public abstract void listSuggestions(String command, Set<String> output, CommandContextBuilder<S> contextBuilder);
|
||||||
|
|
||||||
public abstract ArgumentBuilder<S, ?> createBuilder();
|
public abstract ArgumentBuilder<S, ?> createBuilder();
|
||||||
|
|
||||||
|
protected abstract String getSortedKey();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(CommandNode<S> o) {
|
||||||
|
return ComparisonChain
|
||||||
|
.start()
|
||||||
|
.compareTrueFirst(this instanceof LiteralCommandNode, o instanceof LiteralCommandNode)
|
||||||
|
.compare(getSortedKey(), o.getSortedKey())
|
||||||
|
.result();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,4 +81,9 @@ public class LiteralCommandNode<S> extends CommandNode<S> {
|
||||||
}
|
}
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getSortedKey() {
|
||||||
|
return literal;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,4 +41,9 @@ public class RootCommandNode<S> extends CommandNode<S> {
|
||||||
public ArgumentBuilder<S, ?> createBuilder() {
|
public ArgumentBuilder<S, ?> createBuilder() {
|
||||||
throw new IllegalStateException("Cannot convert root into a builder");
|
throw new IllegalStateException("Cannot convert root into a builder");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getSortedKey() {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ public class CommandDispatcherCompletionsTest {
|
||||||
subject.register(literal("foo"));
|
subject.register(literal("foo"));
|
||||||
subject.register(literal("bar"));
|
subject.register(literal("bar"));
|
||||||
subject.register(literal("baz").requires(s -> false));
|
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("f", source), equalTo(new String[] {"foo"}));
|
||||||
assertThat(subject.getCompletionSuggestions("b", source), equalTo(new String[] {"bar"}));
|
assertThat(subject.getCompletionSuggestions("b", source), equalTo(new String[] {"bar"}));
|
||||||
assertThat(subject.getCompletionSuggestions("q", source), is(emptyArray()));
|
assertThat(subject.getCompletionSuggestions("q", source), is(emptyArray()));
|
||||||
|
@ -46,7 +46,7 @@ public class CommandDispatcherCompletionsTest {
|
||||||
public void testSubCommand() throws Exception {
|
public void testSubCommand() throws Exception {
|
||||||
subject.register(literal("foo").then(literal("abc")).then(literal("def")).then(literal("ghi").requires(s -> false)));
|
subject.register(literal("foo").then(literal("abc")).then(literal("def")).then(literal("ghi").requires(s -> false)));
|
||||||
subject.register(literal("bar"));
|
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("f", source), equalTo(new String[] {"foo"}));
|
||||||
assertThat(subject.getCompletionSuggestions("foo", source), equalTo(new String[] {"foo"}));
|
assertThat(subject.getCompletionSuggestions("foo", source), equalTo(new String[] {"foo"}));
|
||||||
assertThat(subject.getCompletionSuggestions("foo ", source), equalTo(new String[] {"abc", "def"}));
|
assertThat(subject.getCompletionSuggestions("foo ", source), equalTo(new String[] {"abc", "def"}));
|
||||||
|
|
|
@ -19,6 +19,7 @@ import java.util.Set;
|
||||||
|
|
||||||
import static com.mojang.brigadier.arguments.IntegerArgumentType.integer;
|
import static com.mojang.brigadier.arguments.IntegerArgumentType.integer;
|
||||||
import static org.hamcrest.Matchers.empty;
|
import static org.hamcrest.Matchers.empty;
|
||||||
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
import static org.hamcrest.Matchers.hasToString;
|
import static org.hamcrest.Matchers.hasToString;
|
||||||
import static org.hamcrest.Matchers.is;
|
import static org.hamcrest.Matchers.is;
|
||||||
import static org.junit.Assert.assertThat;
|
import static org.junit.Assert.assertThat;
|
||||||
|
@ -202,4 +203,24 @@ public class IntegerArgumentTypeTest {
|
||||||
assertThat(integer(-100, 100), hasToString("integer(-100, 100)"));
|
assertThat(integer(-100, 100), hasToString("integer(-100, 100)"));
|
||||||
assertThat(integer(Integer.MIN_VALUE, 100), hasToString("integer(-2147483648, 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"));
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -6,6 +6,7 @@ import com.google.common.testing.EqualsTester;
|
||||||
import com.mojang.brigadier.Command;
|
import com.mojang.brigadier.Command;
|
||||||
import com.mojang.brigadier.CommandDispatcher;
|
import com.mojang.brigadier.CommandDispatcher;
|
||||||
import com.mojang.brigadier.arguments.IntegerArgumentType;
|
import com.mojang.brigadier.arguments.IntegerArgumentType;
|
||||||
|
import com.mojang.brigadier.arguments.StringArgumentType;
|
||||||
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
|
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
|
||||||
import com.mojang.brigadier.context.CommandContextBuilder;
|
import com.mojang.brigadier.context.CommandContextBuilder;
|
||||||
import com.mojang.brigadier.exceptions.CommandException;
|
import com.mojang.brigadier.exceptions.CommandException;
|
||||||
|
@ -68,6 +69,18 @@ public class ArgumentCommandNodeTest extends AbstractCommandNodeTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUsage() throws Exception {
|
public void testUsage() throws Exception {
|
||||||
|
assertThat(node.getUsageText(), is("<foo: int>"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUsage_suffix() throws Exception {
|
||||||
|
node = argument("foo", integer(0, 100, "L")).build();
|
||||||
|
assertThat(node.getUsageText(), is("<foo: int>L"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUsage_empty() throws Exception {
|
||||||
|
ArgumentCommandNode<Object, String> node = argument("foo", StringArgumentType.word()).build();
|
||||||
assertThat(node.getUsageText(), is("<foo>"));
|
assertThat(node.getUsageText(), is("<foo>"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue