diff --git a/SpongeAPI b/SpongeAPI index 64d88b31c63..354c0a71840 160000 --- a/SpongeAPI +++ b/SpongeAPI @@ -1 +1 @@ -Subproject commit 64d88b31c637ee96e253888e12fa7c124a245cb0 +Subproject commit 354c0a718402e962aa8fb3135c2a4297304e322e diff --git a/src/main/java/org/spongepowered/common/command/SpongeCommandCompletionBuilder.java b/src/main/java/org/spongepowered/common/command/SpongeCommandCompletionFactory.java similarity index 59% rename from src/main/java/org/spongepowered/common/command/SpongeCommandCompletionBuilder.java rename to src/main/java/org/spongepowered/common/command/SpongeCommandCompletionFactory.java index e71daf2fc7f..62d392c3056 100644 --- a/src/main/java/org/spongepowered/common/command/SpongeCommandCompletionBuilder.java +++ b/src/main/java/org/spongepowered/common/command/SpongeCommandCompletionFactory.java @@ -29,40 +29,14 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.command.CommandCompletion; -import java.util.Objects; - -public final class SpongeCommandCompletionBuilder implements CommandCompletion.Builder { - - private @Nullable String completion; - private @Nullable Component tooltip; - - @Override - public CommandCompletion.Builder completion(final @NonNull String completion) { - this.completion = Objects.requireNonNull(completion); - if (this.completion.isEmpty()) { - throw new IllegalArgumentException("Completions cannot be empty"); - } - return this; - } +public final class SpongeCommandCompletionFactory implements CommandCompletion.Factory { @Override - public CommandCompletion.Builder tooltip(final @Nullable Component tooltip) { - this.tooltip = tooltip; - return this; - } - - @Override - public CommandCompletion build() { - if (this.completion == null) { - throw new IllegalStateException("A non-empty completion must be supplied"); + @NonNull + public CommandCompletion completion(final @NonNull String completion, final @Nullable Component tooltip) { + if (completion == null || completion.isEmpty()) { + throw new IllegalStateException("The completion may not be null or empty."); } - return new SpongeCommandCompletion(this.completion, this.tooltip); - } - - @Override - public CommandCompletion.Builder reset() { - this.completion = null; - this.tooltip = null; - return this; + return new SpongeCommandCompletion(completion, tooltip); } } diff --git a/src/main/java/org/spongepowered/common/command/SpongeParameterizedCommand.java b/src/main/java/org/spongepowered/common/command/SpongeParameterizedCommand.java index 0a172f9dcef..4fc69d8a08c 100644 --- a/src/main/java/org/spongepowered/common/command/SpongeParameterizedCommand.java +++ b/src/main/java/org/spongepowered/common/command/SpongeParameterizedCommand.java @@ -93,7 +93,7 @@ public void setCommandManager(final SpongeCommandManager commandManager) { } @Override - public List suggestions(final @NonNull CommandCause cause, final ArgumentReader.@NonNull Mutable arguments) { + public List complete(final @NonNull CommandCause cause, final ArgumentReader.@NonNull Mutable arguments) { final SpongeCommandDispatcher dispatcher = this.getCachedDispatcher(); final String input = arguments.remaining(); final ParseResults parseResults = dispatcher.parse((StringReader) arguments, (CommandSourceStack) cause); diff --git a/src/main/java/org/spongepowered/common/command/manager/SpongeCommandManager.java b/src/main/java/org/spongepowered/common/command/manager/SpongeCommandManager.java index 6f2b4c09901..526cd3b6bbf 100644 --- a/src/main/java/org/spongepowered/common/command/manager/SpongeCommandManager.java +++ b/src/main/java/org/spongepowered/common/command/manager/SpongeCommandManager.java @@ -471,7 +471,7 @@ private void prettyPrintThrowableError(final Throwable thr, final String command } @Override - public List suggest(final @NonNull String arguments) { + public List complete(final @NonNull String arguments) { try (final CauseStackManager.StackFrame frame = PhaseTracker.getCauseStackManager().pushCauseFrame()) { frame.addContext(EventContextKeys.COMMAND, arguments); final String[] splitArg = arguments.split(" ", 2); @@ -485,7 +485,7 @@ public List suggest(final @NonNull String arguments) { return Collections.emptyList(); } - return mapping.registrar().suggestions(CommandCause.create(), mapping, command, splitArg[1]); + return mapping.registrar().complete(CommandCause.create(), mapping, command, splitArg[1]); } return this.commandMappings.keySet() @@ -499,25 +499,25 @@ public List suggest(final @NonNull String arguments) { } @Override - public List suggest( + public List complete( final @NonNull T subjectReceiver, final @NonNull String arguments) { try (final CauseStackManager.StackFrame frame = PhaseTracker.getCauseStackManager().pushCauseFrame()) { frame.addContext(EventContextKeys.SUBJECT, subjectReceiver); frame.addContext(EventContextKeys.AUDIENCE, subjectReceiver); - return this.suggest(arguments); + return this.complete(arguments); } } @Override - public List suggest( + public List complete( final @NonNull Subject subject, final @NonNull Audience receiver, final @NonNull String arguments) { try (final CauseStackManager.StackFrame frame = PhaseTracker.getCauseStackManager().pushCauseFrame()) { frame.addContext(EventContextKeys.SUBJECT, subject); frame.addContext(EventContextKeys.AUDIENCE, receiver); - return this.suggest(arguments); + return this.complete(arguments); } } diff --git a/src/main/java/org/spongepowered/common/command/registrar/BrigadierCommandRegistrar.java b/src/main/java/org/spongepowered/common/command/registrar/BrigadierCommandRegistrar.java index a984aab934f..7966cee1154 100644 --- a/src/main/java/org/spongepowered/common/command/registrar/BrigadierCommandRegistrar.java +++ b/src/main/java/org/spongepowered/common/command/registrar/BrigadierCommandRegistrar.java @@ -189,15 +189,15 @@ private Tuple> registerIn } @Override - public List suggestions( + public List complete( final @NonNull CommandCause cause, final @NonNull CommandMapping mapping, final @NonNull String command, final @NonNull String arguments) { + final CompletableFuture suggestionsCompletableFuture = this.dispatcher.getCompletionSuggestions( this.dispatcher.parse(this.createCommandString(command, arguments), (CommandSourceStack) cause, true)); - // TODO: Fix so that we keep suggestions in the Mojang format? return suggestionsCompletableFuture.join().getList().stream().map(SpongeCommandCompletion::from).collect(Collectors.toList()); } diff --git a/src/main/java/org/spongepowered/common/command/registrar/SpongeParameterizedCommandRegistrar.java b/src/main/java/org/spongepowered/common/command/registrar/SpongeParameterizedCommandRegistrar.java index c56ab2cd7c5..595c11b74f6 100644 --- a/src/main/java/org/spongepowered/common/command/registrar/SpongeParameterizedCommandRegistrar.java +++ b/src/main/java/org/spongepowered/common/command/registrar/SpongeParameterizedCommandRegistrar.java @@ -128,7 +128,7 @@ private SpongeCommandManager commandManager() { } @Override - public List suggestions( + public List complete( final @NonNull CommandCause cause, final @NonNull CommandMapping mapping, final @NonNull String command, diff --git a/src/main/java/org/spongepowered/common/command/registrar/SpongeRawCommandRegistrar.java b/src/main/java/org/spongepowered/common/command/registrar/SpongeRawCommandRegistrar.java index 2c69fd04504..13c8ba014d2 100644 --- a/src/main/java/org/spongepowered/common/command/registrar/SpongeRawCommandRegistrar.java +++ b/src/main/java/org/spongepowered/common/command/registrar/SpongeRawCommandRegistrar.java @@ -93,10 +93,10 @@ public CommandResult process(final CommandCause cause, final CommandMapping mapp } @Override - public List suggestions(final CommandCause cause, final CommandMapping mapping, final String command, final String arguments) throws CommandException { + public List complete(final CommandCause cause, final CommandMapping mapping, final String command, final String arguments) throws CommandException { final Command.Raw commandToExecute = this.commands.get(mapping); if (commandToExecute.canExecute(cause)) { - return commandToExecute.suggestions(cause, new SpongeStringReader(arguments)); + return commandToExecute.complete(cause, new SpongeStringReader(arguments)); } return Collections.emptyList(); } diff --git a/src/main/java/org/spongepowered/common/registry/SpongeBuilderProvider.java b/src/main/java/org/spongepowered/common/registry/SpongeBuilderProvider.java index d83d7c8cebc..8fd1b5af260 100644 --- a/src/main/java/org/spongepowered/common/registry/SpongeBuilderProvider.java +++ b/src/main/java/org/spongepowered/common/registry/SpongeBuilderProvider.java @@ -132,7 +132,7 @@ import org.spongepowered.common.ban.SpongeBanBuilder; import org.spongepowered.common.block.SpongeBlockSnapshotBuilder; import org.spongepowered.common.block.SpongeBlockStateBuilder; -import org.spongepowered.common.command.SpongeCommandCompletionBuilder; +import org.spongepowered.common.command.SpongeCommandCompletionFactory; import org.spongepowered.common.command.SpongeParameterizedCommandBuilder; import org.spongepowered.common.command.parameter.SpongeParameterKeyBuilder; import org.spongepowered.common.command.parameter.flag.SpongeFlagBuilder; @@ -354,7 +354,6 @@ public void registerDefaultBuilders() { .register(MapColor.Builder.class, SpongeMapColorBuilder::new) .register(MapDecoration.Builder.class, SpongeMapDecorationBuilder::new) .register(MapCanvas.Builder.class, SpongeMapCanvasBuilder::new) - .register(CommandCompletion.Builder.class, SpongeCommandCompletionBuilder::new) ; } } diff --git a/src/main/java/org/spongepowered/common/registry/SpongeFactoryProvider.java b/src/main/java/org/spongepowered/common/registry/SpongeFactoryProvider.java index 88a1211050d..a02bb5d4d9c 100644 --- a/src/main/java/org/spongepowered/common/registry/SpongeFactoryProvider.java +++ b/src/main/java/org/spongepowered/common/registry/SpongeFactoryProvider.java @@ -34,6 +34,7 @@ import org.spongepowered.api.adventure.Audiences; import org.spongepowered.api.adventure.SpongeComponents; import org.spongepowered.api.command.CommandCause; +import org.spongepowered.api.command.CommandCompletion; import org.spongepowered.api.command.parameter.Parameter; import org.spongepowered.api.command.parameter.managed.standard.VariableValueParameters; import org.spongepowered.api.command.registrar.tree.CommandTreeNode; @@ -90,6 +91,7 @@ import org.spongepowered.common.advancement.criterion.SpongeOrCriterion; import org.spongepowered.common.adventure.AudiencesFactory; import org.spongepowered.common.adventure.SpongeAdventure; +import org.spongepowered.common.command.SpongeCommandCompletionFactory; import org.spongepowered.common.command.manager.SpongeCommandCauseFactory; import org.spongepowered.common.command.parameter.SpongeParameterFactory; import org.spongepowered.common.command.parameter.managed.factory.SpongeVariableValueParametersFactory; @@ -232,6 +234,7 @@ public void registerDefaultFactories() { .registerFactory(ChunkGenerator.Factory.class, new SpongeChunkGeneratorFactory()) .registerFactory(ItemStackComparators.Factory.class, new SpongeItemStackComparatorFactory()) .registerFactory(Favicon.Factory.class, new SpongeFavicon.FactoryImpl()) + .registerFactory(CommandCompletion.Factory.class, new SpongeCommandCompletionFactory()) ; } } diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/server/network/ServerGamePacketListenerImplMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/server/network/ServerGamePacketListenerImplMixin.java index fc51595681e..5614f6d71be 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/server/network/ServerGamePacketListenerImplMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/server/network/ServerGamePacketListenerImplMixin.java @@ -198,7 +198,7 @@ public abstract class ServerGamePacketListenerImplMixin implements ConnectionHol if (mapping.registrar().canExecute(cause, mapping)) { try { final SuggestionsBuilder builder = new SuggestionsBuilder(rawCommand, rawCommand.lastIndexOf(" ") + 1); - mapping.registrar().suggestions(cause, mapping, command[0], command[1]) + mapping.registrar().complete(cause, mapping, command[0], command[1]) .forEach(completion -> builder.suggest(completion.completion(), completion.tooltip().map(SpongeAdventure::asVanilla).orElse(null))); this.connection.send(new ClientboundCommandSuggestionsPacket(packet.getId(), builder.build())); diff --git a/testplugins/src/main/java/org/spongepowered/test/TestPlugin.java b/testplugins/src/main/java/org/spongepowered/test/TestPlugin.java index 48a4f72677c..ecbbc9dbc66 100644 --- a/testplugins/src/main/java/org/spongepowered/test/TestPlugin.java +++ b/testplugins/src/main/java/org/spongepowered/test/TestPlugin.java @@ -58,9 +58,7 @@ public void onRegisterCommand(final RegisterCommandEvent (context, currentInput) -> Sponge.pluginManager().plugins().stream() .filter(pc -> pc.instance() instanceof LoadableModule) .filter(x -> x.metadata().id().startsWith(currentInput)) - .map(x -> CommandCompletion.builder().completion(x.metadata().id()) - .tooltip(Component.text(x.metadata().name().orElseGet(() -> x.metadata().id()))) - .build()) + .map(x -> CommandCompletion.of(x.metadata().id(), Component.text(x.metadata().name().orElseGet(() -> x.metadata().id())))) .collect(Collectors.toList())).build(); final Command.Parameterized enableCommand = Command.builder().addParameter(pluginKey) .executor(context -> { diff --git a/testplugins/src/main/java/org/spongepowered/test/command/ClientSuggestionsRawCommandTest.java b/testplugins/src/main/java/org/spongepowered/test/command/ClientSuggestionsRawCommandTest.java index c9239c69d45..abcf51e8d8d 100644 --- a/testplugins/src/main/java/org/spongepowered/test/command/ClientSuggestionsRawCommandTest.java +++ b/testplugins/src/main/java/org/spongepowered/test/command/ClientSuggestionsRawCommandTest.java @@ -51,7 +51,7 @@ public class ClientSuggestionsRawCommandTest implements Command.Raw { } @Override - public List suggestions(@NonNull final CommandCause cause, final ArgumentReader.@NonNull Mutable arguments) throws CommandException { + public List complete(@NonNull final CommandCause cause, final ArgumentReader.@NonNull Mutable arguments) throws CommandException { // This should not get hit return Collections.emptyList(); } diff --git a/testplugins/src/main/java/org/spongepowered/test/command/RawCommandTest.java b/testplugins/src/main/java/org/spongepowered/test/command/RawCommandTest.java index 8804e0e3508..79359ab0f2a 100644 --- a/testplugins/src/main/java/org/spongepowered/test/command/RawCommandTest.java +++ b/testplugins/src/main/java/org/spongepowered/test/command/RawCommandTest.java @@ -61,7 +61,7 @@ public CommandResult process(final @NonNull CommandCause cause, final ArgumentRe } @Override - public List suggestions(final @NonNull CommandCause cause, final ArgumentReader.@NonNull Mutable arguments) throws CommandException { + public List complete(final @NonNull CommandCause cause, final ArgumentReader.@NonNull Mutable arguments) throws CommandException { if (arguments.remaining().endsWith(" ")) { return this.suggestions; }