Make suggestions more robust.

And fix potential errors in the ^[] pattern parser.
This commit is contained in:
wizjany 2019-06-01 12:32:14 -04:00
parent a3ca670a32
commit a3afd9d5b3
2 changed files with 26 additions and 8 deletions

View File

@ -19,7 +19,6 @@
package com.sk89q.worldedit.extension.factory.parser.pattern; package com.sk89q.worldedit.extension.factory.parser.pattern;
import com.google.common.base.Splitter;
import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.command.util.SuggestionHelper; import com.sk89q.worldedit.command.util.SuggestionHelper;
import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.InputParseException;
@ -32,6 +31,7 @@ import com.sk89q.worldedit.function.pattern.StateApplyingPattern;
import com.sk89q.worldedit.function.pattern.TypeApplyingPattern; import com.sk89q.worldedit.function.pattern.TypeApplyingPattern;
import com.sk89q.worldedit.internal.registry.InputParser; import com.sk89q.worldedit.internal.registry.InputParser;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -82,10 +82,21 @@ public class TypeOrStateApplyingPatternParser extends InputParser<Pattern> {
worldEdit.getBlockFactory().parseFromInput(type, context).getBlockType().getDefaultState()); worldEdit.getBlockFactory().parseFromInput(type, context).getBlockType().getDefaultState());
} else { } else {
// states given // states given
if (!parts[1].endsWith("]")) throw new InputParseException("Invalid state format."); if (!parts[1].endsWith("]")) throw new InputParseException("State is missing trailing ']'");
Map<String, String> statesToSet = Splitter.on(',') final String[] states = parts[1].substring(0, parts[1].length() - 1).split(",");
.omitEmptyStrings().trimResults().withKeyValueSeparator('=') Map<String, String> statesToSet = new HashMap<>();
.split(parts[1].substring(0, parts[1].length() - 1)); for (String state : states) {
if (state.isEmpty()) throw new InputParseException("Empty part in state");
String[] propVal = state.split("=", 2);
if (propVal.length != 2) throw new InputParseException("Missing '=' separator");
final String prop = propVal[0];
if (prop.isEmpty()) throw new InputParseException("Empty property in state");
final String value = propVal[1];
if (value.isEmpty()) throw new InputParseException("Empty value in state");
if (statesToSet.put(prop, value) != null) {
throw new InputParseException("Duplicate properties in state");
}
}
if (type.isEmpty()) { if (type.isEmpty()) {
return new StateApplyingPattern(extent, statesToSet); return new StateApplyingPattern(extent, statesToSet);
} else { } else {

View File

@ -569,7 +569,16 @@ public final class PlatformCommandManager {
.map(Substring::getSubstring) .map(Substring::getSubstring)
.collect(Collectors.toList()); .collect(Collectors.toList());
MemoizingValueAccess access = initializeInjectedValues(() -> arguments, event.getActor()); MemoizingValueAccess access = initializeInjectedValues(() -> arguments, event.getActor());
ImmutableSet<Suggestion> suggestions = commandManager.getSuggestions(access, argStrings); ImmutableSet<Suggestion> suggestions;
try {
suggestions = commandManager.getSuggestions(access, argStrings);
} catch (Throwable t) { // catch errors which are *not* command exceptions generated by parsers/suggesters
if (!(t instanceof CommandException)) {
log.debug("Unexpected error occurred while generating suggestions for input: " + arguments, t);
return;
}
throw t;
}
event.setSuggestions(suggestions.stream() event.setSuggestions(suggestions.stream()
.map(suggestion -> { .map(suggestion -> {
@ -588,8 +597,6 @@ public final class PlatformCommandManager {
if (e.getCondition() instanceof PermissionCondition) { if (e.getCondition() instanceof PermissionCondition) {
event.setSuggestions(new ArrayList<>()); event.setSuggestions(new ArrayList<>());
} }
} catch (CommandException e) {
event.getActor().printError(e.getMessage());
} }
} }