Skip to content

Commit 7a6e458

Browse files
committed
Initial attempt at list/repeating arguments
1 parent a6c4baa commit 7a6e458

File tree

2 files changed

+61
-7
lines changed

2 files changed

+61
-7
lines changed

src/main/java/com/mojang/brigadier/builder/RequiredArgumentBuilder.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,21 @@
1111
public class RequiredArgumentBuilder<S, T> extends ArgumentBuilder<S, RequiredArgumentBuilder<S, T>> {
1212
private final String name;
1313
private final ArgumentType<T> type;
14+
private final boolean list;
1415
private SuggestionProvider<S> suggestionsProvider = null;
1516

16-
private RequiredArgumentBuilder(final String name, final ArgumentType<T> type) {
17+
private RequiredArgumentBuilder(final String name, final ArgumentType<T> type, boolean list) {
1718
this.name = name;
1819
this.type = type;
20+
this.list = list;
1921
}
2022

2123
public static <S, T> RequiredArgumentBuilder<S, T> argument(final String name, final ArgumentType<T> type) {
22-
return new RequiredArgumentBuilder<>(name, type);
24+
return new RequiredArgumentBuilder<>(name, type, false);
25+
}
26+
27+
public static <S, T> RequiredArgumentBuilder<S, T> list(final String name, final ArgumentType<T> type) {
28+
return new RequiredArgumentBuilder<>(name, type, true);
2329
}
2430

2531
public RequiredArgumentBuilder<S, T> suggests(final SuggestionProvider<S> provider) {
@@ -44,8 +50,10 @@ public String getName() {
4450
return name;
4551
}
4652

53+
public boolean isList() { return list; }
54+
4755
public ArgumentCommandNode<S, T> build() {
48-
final ArgumentCommandNode<S, T> result = new ArgumentCommandNode<>(getName(), getType(), getCommand(), getRequirement(), getRedirect(), getRedirectModifier(), isFork(), getSuggestionsProvider());
56+
final ArgumentCommandNode<S, T> result = new ArgumentCommandNode<>(getName(), getType(), getCommand(), getRequirement(), getRedirect(), getRedirectModifier(), isFork(), getSuggestionsProvider(), isList());
4957

5058
for (final CommandNode<S> argument : getArguments()) {
5159
result.addChild(argument);

src/main/java/com/mojang/brigadier/tree/ArgumentCommandNode.java

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,15 @@
1111
import com.mojang.brigadier.context.CommandContext;
1212
import com.mojang.brigadier.context.CommandContextBuilder;
1313
import com.mojang.brigadier.context.ParsedArgument;
14+
import com.mojang.brigadier.context.StringRange;
1415
import com.mojang.brigadier.exceptions.CommandSyntaxException;
1516
import com.mojang.brigadier.suggestion.SuggestionProvider;
1617
import com.mojang.brigadier.suggestion.Suggestions;
1718
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
1819

20+
import java.util.ArrayList;
1921
import java.util.Collection;
22+
import java.util.List;
2023
import java.util.concurrent.CompletableFuture;
2124
import java.util.function.Predicate;
2225

@@ -27,12 +30,21 @@ public class ArgumentCommandNode<S, T> extends CommandNode<S> {
2730
private final String name;
2831
private final ArgumentType<T> type;
2932
private final SuggestionProvider<S> customSuggestions;
33+
private final boolean list;
34+
private Collection<? extends CommandNode<S>> cached;
35+
private Collection<? extends CommandNode<S>> cachedOut;
3036

37+
@Deprecated
3138
public ArgumentCommandNode(final String name, final ArgumentType<T> type, final Command<S> command, final Predicate<S> requirement, final CommandNode<S> redirect, final RedirectModifier<S> modifier, final boolean forks, final SuggestionProvider<S> customSuggestions) {
39+
this(name, type, command, requirement, redirect, modifier, forks, customSuggestions, false);
40+
}
41+
42+
public ArgumentCommandNode(final String name, final ArgumentType<T> type, final Command<S> command, final Predicate<S> requirement, final CommandNode<S> redirect, final RedirectModifier<S> modifier, final boolean forks, final SuggestionProvider<S> customSuggestions, boolean list) {
3243
super(command, requirement, redirect, modifier, forks);
3344
this.name = name;
3445
this.type = type;
3546
this.customSuggestions = customSuggestions;
47+
this.list = list;
3648
}
3749

3850
public ArgumentType<T> getType() {
@@ -57,10 +69,24 @@ public SuggestionProvider<S> getCustomSuggestions() {
5769
public void parse(final StringReader reader, final CommandContextBuilder<S> contextBuilder) throws CommandSyntaxException {
5870
final int start = reader.getCursor();
5971
final T result = type.parse(reader);
60-
final ParsedArgument<S, T> parsed = new ParsedArgument<>(start, reader.getCursor(), result);
6172

62-
contextBuilder.withArgument(name, parsed);
63-
contextBuilder.withNode(this, parsed.getRange());
73+
if (!list) {
74+
final ParsedArgument<S, T> parsed = new ParsedArgument<>(start, reader.getCursor(), result);
75+
76+
contextBuilder.withArgument(name, parsed);
77+
} else {
78+
ParsedArgument<S, List<T>> parsed = (ParsedArgument<S, List<T>>) contextBuilder.getArguments().get(name);
79+
if (parsed == null) {
80+
parsed = new ParsedArgument<>(start, reader.getCursor(), new ArrayList<>());
81+
} else {
82+
parsed = new ParsedArgument<>(parsed.getRange().getStart(), reader.getCursor(), parsed.getResult());
83+
}
84+
parsed.getResult().add(result);
85+
86+
contextBuilder.withArgument(name, parsed);
87+
}
88+
89+
contextBuilder.withNode(this, new StringRange(start, reader.getCursor()));
6490
}
6591

6692
@Override
@@ -74,7 +100,7 @@ public CompletableFuture<Suggestions> listSuggestions(final CommandContext<S> co
74100

75101
@Override
76102
public RequiredArgumentBuilder<S, T> createBuilder() {
77-
final RequiredArgumentBuilder<S, T> builder = RequiredArgumentBuilder.argument(name, type);
103+
final RequiredArgumentBuilder<S, T> builder = list ? RequiredArgumentBuilder.list(name, type) : RequiredArgumentBuilder.argument(name, type);
78104
builder.requires(getRequirement());
79105
builder.forward(getRedirect(), getRedirectModifier(), isFork());
80106
builder.suggests(customSuggestions);
@@ -128,4 +154,24 @@ public Collection<String> getExamples() {
128154
public String toString() {
129155
return "<argument " + name + ":" + type +">";
130156
}
157+
158+
@Override
159+
public Collection<? extends CommandNode<S>> getRelevantNodes(StringReader input) {
160+
if (!list) {
161+
return super.getRelevantNodes(input);
162+
} else {
163+
Collection<? extends CommandNode<S>> relevantNodes = super.getRelevantNodes(input);
164+
if (relevantNodes.size() == 1 && relevantNodes.stream().allMatch(node -> node instanceof LiteralCommandNode)) {
165+
return relevantNodes;
166+
} else {
167+
if (cached != relevantNodes) {
168+
cached = relevantNodes;
169+
ArrayList<CommandNode<S>> commandNodes = new ArrayList<>(cached);
170+
commandNodes.add(this);
171+
cachedOut = commandNodes;
172+
}
173+
return cachedOut;
174+
}
175+
}
176+
}
131177
}

0 commit comments

Comments
 (0)