From b29d1ae5d1868376ead0159d9b7120ba0d30e56b Mon Sep 17 00:00:00 2001 From: Irmo van den Berge Date: Sat, 19 Dec 2020 21:44:49 +0100 Subject: [PATCH] Fix suggestions showing twice on spigot+brigadier Signed-off-by: Irmo van den Berge --- .../brigadier/CloudBrigadierManager.java | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/cloud-minecraft/cloud-brigadier/src/main/java/cloud/commandframework/brigadier/CloudBrigadierManager.java b/cloud-minecraft/cloud-brigadier/src/main/java/cloud/commandframework/brigadier/CloudBrigadierManager.java index 7dbba791..947507b8 100644 --- a/cloud-minecraft/cloud-brigadier/src/main/java/cloud/commandframework/brigadier/CloudBrigadierManager.java +++ b/cloud-minecraft/cloud-brigadier/src/main/java/cloud/commandframework/brigadier/CloudBrigadierManager.java @@ -63,7 +63,6 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -73,6 +72,7 @@ import java.util.function.BiPredicate; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Manager used to map cloud {@link Command} @@ -375,8 +375,8 @@ public final class CloudBrigadierManager { .getCommandTree().getNamedNode(cloudCommand.getArguments().get(0).getName()); final SuggestionProvider provider = (context, builder) -> this.buildSuggestions( context, + null, /* parent node, null for the literal command node root */ node.getValue(), - Collections.emptySet(), builder ); @@ -503,17 +503,6 @@ public final class CloudBrigadierManager { ))) .executes(executor); } else { - // Check for sibling literals (StaticArgument) - // These are important when providing suggestions - final Set siblingLiterals = (root.getParent() == null) ? Collections.emptySet() - : root.getParent().getChildren().stream() - .filter(n -> n.getValue() instanceof StaticArgument) - .map(n -> (StaticArgument) ((CommandArgument) n.getValue())) - .flatMap(s -> s.getAliases().stream()) - .sorted() - .distinct() - .collect(Collectors.toSet()); - // Register argument final Pair, Boolean> pair = this.getArgument( root.getValue().getValueType(), @@ -524,8 +513,8 @@ public final class CloudBrigadierManager { ? null : (context, builder) -> this.buildSuggestions( context, + root.getParent(), root.getValue(), - siblingLiterals, builder ); argumentBuilder = RequiredArgumentBuilder @@ -554,8 +543,8 @@ public final class CloudBrigadierManager { private @NonNull CompletableFuture buildSuggestions( final com.mojang.brigadier.context.@Nullable CommandContext senderContext, + final CommandTree.@Nullable Node> parentNode, final @NonNull CommandArgument argument, - final @NonNull Set siblingLiterals, final @NonNull SuggestionsBuilder builder ) { final CommandContext commandContext; @@ -586,9 +575,17 @@ public final class CloudBrigadierManager { command ); - /* Filter suggetions that are literal arguments to avoid duplicates */ + /* Filter suggestions that are literal arguments to avoid duplicates, except for root arguments */ final List suggestions = new ArrayList<>(suggestionsUnfiltered); - suggestions.removeIf(siblingLiterals::contains); + if (parentNode != null) { + final Set siblingLiterals = parentNode.getChildren().stream() + .map(CommandTree.Node::getValue) + .flatMap(arg -> (arg instanceof StaticArgument) + ? ((StaticArgument) arg).getAliases().stream() : Stream.empty()) + .collect(Collectors.toSet()); + + suggestions.removeIf(siblingLiterals::contains); + } SuggestionsBuilder suggestionsBuilder = builder;