From 1fccb8950186caae273e45f1b08ebe2797214293 Mon Sep 17 00:00:00 2001
From: md_5 <git@md-5.net>
Date: Mon, 16 Jul 2018 21:03:46 +1000
Subject: [PATCH] Fix completion of multiple arguments in Bukkit commands

---
 .../suggestion/SuggestionsBuilder.java        | 80 +++++++++++++++++++
 .../command/BukkitCommandWrapper.java         |  5 ++
 2 files changed, 85 insertions(+)
 create mode 100644 src/main/java/com/mojang/brigadier/suggestion/SuggestionsBuilder.java

diff --git a/src/main/java/com/mojang/brigadier/suggestion/SuggestionsBuilder.java b/src/main/java/com/mojang/brigadier/suggestion/SuggestionsBuilder.java
new file mode 100644
index 0000000000..23c7c2c0ec
--- /dev/null
+++ b/src/main/java/com/mojang/brigadier/suggestion/SuggestionsBuilder.java
@@ -0,0 +1,80 @@
+package com.mojang.brigadier.suggestion;
+
+import com.mojang.brigadier.Message;
+import com.mojang.brigadier.context.StringRange;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+public class SuggestionsBuilder {
+    private final String input;
+    public int start;
+    public String remaining;
+    private final List<Suggestion> result = new ArrayList<>();
+
+    public SuggestionsBuilder(final String input, final int start) {
+        this.input = input;
+        this.start = start;
+        this.remaining = input.substring(start);
+    }
+
+    public String getInput() {
+        return input;
+    }
+
+    public int getStart() {
+        return start;
+    }
+
+    public String getRemaining() {
+        return remaining;
+    }
+
+    public Suggestions build() {
+        return Suggestions.create(input, result);
+    }
+
+    public CompletableFuture<Suggestions> buildFuture() {
+        return CompletableFuture.completedFuture(build());
+    }
+
+    public SuggestionsBuilder suggest(final String text) {
+        if (text.equals(remaining)) {
+            return this;
+        }
+        result.add(new Suggestion(StringRange.between(start, input.length()), text));
+        return this;
+    }
+
+    public SuggestionsBuilder suggest(final String text, final Message tooltip) {
+        if (text.equals(remaining)) {
+            return this;
+        }
+        result.add(new Suggestion(StringRange.between(start, input.length()), text, tooltip));
+        return this;
+    }
+
+    public SuggestionsBuilder suggest(final int value) {
+        result.add(new IntegerSuggestion(StringRange.between(start, input.length()), value));
+        return this;
+    }
+
+    public SuggestionsBuilder suggest(final int value, final Message tooltip) {
+        result.add(new IntegerSuggestion(StringRange.between(start, input.length()), value, tooltip));
+        return this;
+    }
+
+    public SuggestionsBuilder add(final SuggestionsBuilder other) {
+        result.addAll(other.result);
+        return this;
+    }
+
+    public SuggestionsBuilder createOffset(final int start) {
+        return new SuggestionsBuilder(input, start);
+    }
+
+    public SuggestionsBuilder restart() {
+        return new SuggestionsBuilder(input, start);
+    }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java b/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java
index d69855ed6d..acd3f17c67 100644
--- a/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java
+++ b/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java
@@ -47,6 +47,11 @@ public class BukkitCommandWrapper implements com.mojang.brigadier.Command<Comman
     @Override
     public CompletableFuture<Suggestions> getSuggestions(CommandContext<CommandListenerWrapper> context, SuggestionsBuilder builder) throws CommandSyntaxException {
         List<String> results = server.tabComplete(context.getSource().getBukkitSender(), builder.getInput(), context.getSource().getWorld(), context.getSource().getPosition(), true);
+
+        // These are normally only set based on sub nodes, but we have just one giant args node
+        builder.start = builder.getInput().lastIndexOf(' ') + 1;
+        builder.remaining = builder.getInput().substring(builder.start);
+
         for (String s : results) {
             builder.suggest(s);
         }