Made suggestions async

This commit is contained in:
Nathan Adams
2017-11-08 14:50:25 +01:00
parent b48dbe7916
commit 4f7c6d4e32
13 changed files with 66 additions and 67 deletions
@@ -23,6 +23,12 @@ import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@@ -285,11 +291,8 @@ public class CommandDispatcher<S> {
return self;
}
public CommandSuggestions getCompletionSuggestions(final ParseResults<S> parse) {
public CompletableFuture<CommandSuggestions> getCompletionSuggestions(final ParseResults<S> parse) {
final CommandContextBuilder<S> context = parse.getContext();
final Set<String> suggestions = new LinkedHashSet<>();
final CommandNode<S> parent;
final int start;
@@ -309,13 +312,24 @@ public class CommandDispatcher<S> {
start = 0;
}
@SuppressWarnings("unchecked") final CompletableFuture<Collection<String>>[] futures = new CompletableFuture[parent.getChildren().size()];
int i = 0;
for (final CommandNode<S> node : parent.getChildren()) {
node.listSuggestions(parse.getReader().getString().substring(start), suggestions, context);
futures[i++] = node.listSuggestions(parse.getReader().getString().substring(start));
}
final List<String> result = new ArrayList<>(suggestions);
Collections.sort(result);
return new CommandSuggestions(new StringRange(start, parse.getReader().getTotalLength()), result);
final CompletableFuture<CommandSuggestions> result = new CompletableFuture<>();
CompletableFuture.allOf(futures).thenRun(() -> {
final Set<String> suggestions = Sets.newHashSet();
for (final CompletableFuture<Collection<String>> future : futures) {
suggestions.addAll(future.join());
}
final List<String> sorted = new ArrayList<>(suggestions);
Collections.sort(sorted);
result.complete(new CommandSuggestions(new StringRange(start, parse.getReader().getTotalLength()), sorted));
});
return result;
}
public RootCommandNode<S> getRoot() {
@@ -4,11 +4,14 @@ import com.mojang.brigadier.StringReader;
import com.mojang.brigadier.context.CommandContextBuilder;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import java.util.Set;
import java.util.Collection;
import java.util.Collections;
import java.util.concurrent.CompletableFuture;
public interface ArgumentType<T> {
<S> T parse(StringReader reader, CommandContextBuilder<S> contextBuilder) throws CommandSyntaxException;
default <S> void listSuggestions(final String command, final Set<String> output, final CommandContextBuilder<S> contextBuilder) {
default <S> CompletableFuture<Collection<String>> listSuggestions(final String command) {
return CompletableFuture.completedFuture(Collections.emptyList());
}
}
@@ -5,14 +5,12 @@ import com.mojang.brigadier.RedirectModifier;
import com.mojang.brigadier.StringReader;
import com.mojang.brigadier.arguments.ArgumentType;
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.context.CommandContextBuilder;
import com.mojang.brigadier.context.ParsedArgument;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import java.util.Collection;
import java.util.Set;
import java.util.function.Function;
import java.util.concurrent.CompletableFuture;
import java.util.function.Predicate;
public class ArgumentCommandNode<S, T> extends CommandNode<S> {
@@ -57,8 +55,8 @@ public class ArgumentCommandNode<S, T> extends CommandNode<S> {
}
@Override
public void listSuggestions(final String command, final Set<String> output, final CommandContextBuilder<S> contextBuilder) {
type.listSuggestions(command, output, contextBuilder);
public CompletableFuture<Collection<String>> listSuggestions(final String command) {
return type.listSuggestions(command);
}
@Override
@@ -14,6 +14,8 @@ import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@@ -97,7 +99,7 @@ public abstract class CommandNode<S> implements Comparable<CommandNode<S>> {
public abstract void parse(StringReader reader, CommandContextBuilder<S> contextBuilder) throws CommandSyntaxException;
public abstract void listSuggestions(String command, Set<String> output, CommandContextBuilder<S> contextBuilder);
public abstract CompletableFuture<Collection<String>> listSuggestions(String command);
public abstract ArgumentBuilder<S, ?> createBuilder();
@@ -4,15 +4,16 @@ import com.mojang.brigadier.Command;
import com.mojang.brigadier.RedirectModifier;
import com.mojang.brigadier.StringReader;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.context.CommandContextBuilder;
import com.mojang.brigadier.context.StringRange;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.exceptions.ParameterizedCommandExceptionType;
import java.util.Collection;
import java.util.Collections;
import java.util.Set;
import java.util.function.Function;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;
import java.util.function.Predicate;
public class LiteralCommandNode<S> extends CommandNode<S> {
@@ -50,9 +51,11 @@ public class LiteralCommandNode<S> extends CommandNode<S> {
}
@Override
public void listSuggestions(final String command, final Set<String> output, final CommandContextBuilder<S> contextBuilder) {
public CompletableFuture<Collection<String>> listSuggestions(final String command) {
if (literal.startsWith(command)) {
output.add(literal);
return CompletableFuture.completedFuture(Collections.singleton(literal));
} else {
return CompletableFuture.completedFuture(Collections.emptyList());
}
}
@@ -5,8 +5,9 @@ import com.mojang.brigadier.builder.ArgumentBuilder;
import com.mojang.brigadier.context.CommandContextBuilder;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import java.util.Collection;
import java.util.Collections;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
public class RootCommandNode<S> extends CommandNode<S> {
public RootCommandNode() {
@@ -28,7 +29,8 @@ public class RootCommandNode<S> extends CommandNode<S> {
}
@Override
public void listSuggestions(final String command, final Set<String> output, final CommandContextBuilder<S> contextBuilder) {
public CompletableFuture<Collection<String>> listSuggestions(final String command) {
return CompletableFuture.completedFuture(Collections.emptyList());
}
@Override