Cache lowercase versions of inputs and literals to avoid repeated calls to toLowerCase().
Thank you to Spottedleaf.
This commit is contained in:
parent
242de3fe73
commit
60a94e529d
4 changed files with 22 additions and 7 deletions
|
@ -588,12 +588,13 @@ public class CommandDispatcher<S> {
|
||||||
|
|
||||||
final String fullInput = parse.getReader().getString();
|
final String fullInput = parse.getReader().getString();
|
||||||
final String truncatedInput = fullInput.substring(0, cursor);
|
final String truncatedInput = fullInput.substring(0, cursor);
|
||||||
|
final String truncatedInputLowerCase = truncatedInput.toLowerCase();
|
||||||
@SuppressWarnings("unchecked") final CompletableFuture<Suggestions>[] futures = new CompletableFuture[parent.getChildren().size()];
|
@SuppressWarnings("unchecked") final CompletableFuture<Suggestions>[] futures = new CompletableFuture[parent.getChildren().size()];
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (final CommandNode<S> node : parent.getChildren()) {
|
for (final CommandNode<S> node : parent.getChildren()) {
|
||||||
CompletableFuture<Suggestions> future = Suggestions.empty();
|
CompletableFuture<Suggestions> future = Suggestions.empty();
|
||||||
try {
|
try {
|
||||||
future = node.listSuggestions(context.build(truncatedInput), new SuggestionsBuilder(truncatedInput, start));
|
future = node.listSuggestions(context.build(truncatedInput), new SuggestionsBuilder(truncatedInput, truncatedInputLowerCase, start));
|
||||||
} catch (final CommandSyntaxException ignored) {
|
} catch (final CommandSyntaxException ignored) {
|
||||||
}
|
}
|
||||||
futures[i++] = future;
|
futures[i++] = future;
|
||||||
|
|
|
@ -34,10 +34,10 @@ public class BoolArgumentType implements ArgumentType<Boolean> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <S> CompletableFuture<Suggestions> listSuggestions(final CommandContext<S> context, final SuggestionsBuilder builder) {
|
public <S> CompletableFuture<Suggestions> listSuggestions(final CommandContext<S> context, final SuggestionsBuilder builder) {
|
||||||
if ("true".startsWith(builder.getRemaining().toLowerCase())) {
|
if ("true".startsWith(builder.getRemainingLowerCase())) {
|
||||||
builder.suggest("true");
|
builder.suggest("true");
|
||||||
}
|
}
|
||||||
if ("false".startsWith(builder.getRemaining().toLowerCase())) {
|
if ("false".startsWith(builder.getRemainingLowerCase())) {
|
||||||
builder.suggest("false");
|
builder.suggest("false");
|
||||||
}
|
}
|
||||||
return builder.buildFuture();
|
return builder.buildFuture();
|
||||||
|
|
|
@ -12,14 +12,22 @@ import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
public class SuggestionsBuilder {
|
public class SuggestionsBuilder {
|
||||||
private final String input;
|
private final String input;
|
||||||
|
private final String inputLowerCase;
|
||||||
private final int start;
|
private final int start;
|
||||||
private final String remaining;
|
private final String remaining;
|
||||||
|
private final String remainingLowerCase;
|
||||||
private final List<Suggestion> result = new ArrayList<>();
|
private final List<Suggestion> result = new ArrayList<>();
|
||||||
|
|
||||||
public SuggestionsBuilder(final String input, final int start) {
|
public SuggestionsBuilder(final String input, final String inputLowerCase, final int start) {
|
||||||
this.input = input;
|
this.input = input;
|
||||||
|
this.inputLowerCase = inputLowerCase;
|
||||||
this.start = start;
|
this.start = start;
|
||||||
this.remaining = input.substring(start);
|
this.remaining = input.substring(start);
|
||||||
|
this.remainingLowerCase = inputLowerCase.substring(start);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SuggestionsBuilder(final String input, final int start) {
|
||||||
|
this(input, input.toLowerCase(), start);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getInput() {
|
public String getInput() {
|
||||||
|
@ -34,6 +42,10 @@ public class SuggestionsBuilder {
|
||||||
return remaining;
|
return remaining;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getRemainingLowerCase() {
|
||||||
|
return remainingLowerCase;
|
||||||
|
}
|
||||||
|
|
||||||
public Suggestions build() {
|
public Suggestions build() {
|
||||||
return Suggestions.create(input, result);
|
return Suggestions.create(input, result);
|
||||||
}
|
}
|
||||||
|
@ -74,10 +86,10 @@ public class SuggestionsBuilder {
|
||||||
}
|
}
|
||||||
|
|
||||||
public SuggestionsBuilder createOffset(final int start) {
|
public SuggestionsBuilder createOffset(final int start) {
|
||||||
return new SuggestionsBuilder(input, start);
|
return new SuggestionsBuilder(input, inputLowerCase, start);
|
||||||
}
|
}
|
||||||
|
|
||||||
public SuggestionsBuilder restart() {
|
public SuggestionsBuilder restart() {
|
||||||
return new SuggestionsBuilder(input, start);
|
return createOffset(start);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,10 +21,12 @@ import java.util.function.Predicate;
|
||||||
|
|
||||||
public class LiteralCommandNode<S> extends CommandNode<S> {
|
public class LiteralCommandNode<S> extends CommandNode<S> {
|
||||||
private final String literal;
|
private final String literal;
|
||||||
|
private final String literalLowerCase;
|
||||||
|
|
||||||
public LiteralCommandNode(final String literal, final Command<S> command, final Predicate<S> requirement, final CommandNode<S> redirect, final RedirectModifier<S> modifier, final boolean forks) {
|
public LiteralCommandNode(final String literal, final Command<S> command, final Predicate<S> requirement, final CommandNode<S> redirect, final RedirectModifier<S> modifier, final boolean forks) {
|
||||||
super(command, requirement, redirect, modifier, forks);
|
super(command, requirement, redirect, modifier, forks);
|
||||||
this.literal = literal;
|
this.literal = literal;
|
||||||
|
this.literalLowerCase = literal.toLowerCase();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getLiteral() {
|
public String getLiteral() {
|
||||||
|
@ -66,7 +68,7 @@ public class LiteralCommandNode<S> extends CommandNode<S> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<Suggestions> listSuggestions(final CommandContext<S> context, final SuggestionsBuilder builder) {
|
public CompletableFuture<Suggestions> listSuggestions(final CommandContext<S> context, final SuggestionsBuilder builder) {
|
||||||
if (literal.toLowerCase().startsWith(builder.getRemaining().toLowerCase())) {
|
if (literalLowerCase.startsWith(builder.getRemainingLowerCase())) {
|
||||||
return builder.suggest(literal).buildFuture();
|
return builder.suggest(literal).buildFuture();
|
||||||
} else {
|
} else {
|
||||||
return Suggestions.empty();
|
return Suggestions.empty();
|
||||||
|
|
Loading…
Reference in a new issue