Skip to content

Commit

Permalink
Consider arguments when literal is impermissible
Browse files Browse the repository at this point in the history
Fixes Mojang#87
  • Loading branch information
hugmanrique committed Apr 3, 2021
1 parent cf754c4 commit 862239b
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/main/java/com/mojang/brigadier/CommandDispatcher.java
Original file line number Diff line number Diff line change
Expand Up @@ -354,7 +354,7 @@ private ParseResults<S> parseNodes(final CommandNode<S> node, final StringReader
List<ParseResults<S>> potentials = null;
final int cursor = originalReader.getCursor();

for (final CommandNode<S> child : node.getRelevantNodes(originalReader)) {
for (final CommandNode<S> child : node.getRelevantNodes(originalReader, source)) {
if (!child.canUse(source)) {
continue;
}
Expand Down
7 changes: 6 additions & 1 deletion src/main/java/com/mojang/brigadier/tree/CommandNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,11 @@ public Predicate<S> getRequirement() {
protected abstract String getSortedKey();

public Collection<? extends CommandNode<S>> getRelevantNodes(final StringReader input) {
return this.getRelevantNodes(input, null);
}

public Collection<? extends CommandNode<S>> getRelevantNodes(final StringReader input,
final S source) {
if (literals.size() > 0) {
final int cursor = input.getCursor();
while (input.canRead() && input.peek() != ' ') {
Expand All @@ -159,7 +164,7 @@ public Collection<? extends CommandNode<S>> getRelevantNodes(final StringReader
final String text = input.getString().substring(cursor, input.getCursor());
input.setCursor(cursor);
final LiteralCommandNode<S> literal = literals.get(text);
if (literal != null) {
if (literal != null && (source == null || literal.canUse(source))) {
return Collections.singleton(literal);
} else {
return arguments.values();
Expand Down
22 changes: 22 additions & 0 deletions src/test/java/com/mojang/brigadier/CommandDispatcherTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
package com.mojang.brigadier;

import com.google.common.collect.Lists;
import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.context.CommandContextBuilder;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
Expand Down Expand Up @@ -228,6 +229,27 @@ public void testExecuteAmbiguiousParentSubcommand() throws Exception {
verify(command, never()).run(any());
}

@SuppressWarnings("unchecked")
@Test
public void testExecuteAmbiguousArgumentImpermissibleLiteral() throws Exception {
final Command<Object> command = mock(Command.class);
when(command.run(any())).thenReturn(100);

subject.register(literal("foo")
.then(
literal("bar")
.requires(source -> false)
)
.then(
argument("argument", StringArgumentType.word())
.executes(command)
)
);

assertThat(subject.execute("foo bar", source), is(100));
verify(command).run(any(CommandContext.class));
}

@SuppressWarnings("unchecked")
@Test
public void testExecuteAmbiguiousParentSubcommandViaRedirect() throws Exception {
Expand Down

0 comments on commit 862239b

Please sign in to comment.