Cache lowercase versions of inputs and literals to avoid repeated calls to toLowerCase().

Thank you to Spottedleaf.
This commit is contained in:
slicedlime (Mikael Hedberg) 2021-03-18 14:07:36 +01:00 committed by slicedlime (Mikael Hedberg)
parent 242de3fe73
commit 60a94e529d
4 changed files with 22 additions and 7 deletions

View file

@ -588,12 +588,13 @@ public class CommandDispatcher<S> {
final String fullInput = parse.getReader().getString();
final String truncatedInput = fullInput.substring(0, cursor);
final String truncatedInputLowerCase = truncatedInput.toLowerCase();
@SuppressWarnings("unchecked") final CompletableFuture<Suggestions>[] futures = new CompletableFuture[parent.getChildren().size()];
int i = 0;
for (final CommandNode<S> node : parent.getChildren()) {
CompletableFuture<Suggestions> future = Suggestions.empty();
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) {
}
futures[i++] = future;

View file

@ -34,10 +34,10 @@ public class BoolArgumentType implements ArgumentType<Boolean> {
@Override
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");
}
if ("false".startsWith(builder.getRemaining().toLowerCase())) {
if ("false".startsWith(builder.getRemainingLowerCase())) {
builder.suggest("false");
}
return builder.buildFuture();

View file

@ -12,14 +12,22 @@ import java.util.concurrent.CompletableFuture;
public class SuggestionsBuilder {
private final String input;
private final String inputLowerCase;
private final int start;
private final String remaining;
private final String remainingLowerCase;
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.inputLowerCase = inputLowerCase;
this.start = 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() {
@ -34,6 +42,10 @@ public class SuggestionsBuilder {
return remaining;
}
public String getRemainingLowerCase() {
return remainingLowerCase;
}
public Suggestions build() {
return Suggestions.create(input, result);
}
@ -74,10 +86,10 @@ public class SuggestionsBuilder {
}
public SuggestionsBuilder createOffset(final int start) {
return new SuggestionsBuilder(input, start);
return new SuggestionsBuilder(input, inputLowerCase, start);
}
public SuggestionsBuilder restart() {
return new SuggestionsBuilder(input, start);
return createOffset(start);
}
}

View file

@ -21,10 +21,12 @@ import java.util.function.Predicate;
public class LiteralCommandNode<S> extends CommandNode<S> {
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) {
super(command, requirement, redirect, modifier, forks);
this.literal = literal;
this.literalLowerCase = literal.toLowerCase();
}
public String getLiteral() {
@ -66,7 +68,7 @@ public class LiteralCommandNode<S> extends CommandNode<S> {
@Override
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();
} else {
return Suggestions.empty();