Added suggestions to a lot of factory-related commands

This commit is contained in:
Matthew Miller 2019-05-18 16:47:08 +10:00
parent 7b47d9a945
commit a3ffb91917
14 changed files with 75 additions and 17 deletions

View File

@ -19,6 +19,8 @@
package com.sk89q.worldedit.command.argument; package com.sk89q.worldedit.command.argument;
import static org.enginehub.piston.converter.SuggestionHelper.limitByPrefix;
import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItem;
@ -41,6 +43,7 @@ import org.enginehub.piston.converter.SuccessfulConversion;
import org.enginehub.piston.inject.InjectedValueAccess; import org.enginehub.piston.inject.InjectedValueAccess;
import org.enginehub.piston.inject.Key; import org.enginehub.piston.inject.Key;
import java.util.List;
import java.util.function.Function; import java.util.function.Function;
public class FactoryConverter<T> implements ArgumentConverter<T> { public class FactoryConverter<T> implements ArgumentConverter<T> {
@ -92,6 +95,11 @@ public class FactoryConverter<T> implements ArgumentConverter<T> {
} }
} }
@Override
public List<String> getSuggestions(String input) {
return limitByPrefix(factoryExtractor.apply(worldEdit).getSuggestions(), input);
}
@Override @Override
public Component describeAcceptableArguments() { public Component describeAcceptableArguments() {
return TextComponent.of("any " + description); return TextComponent.of("any " + description);

View File

@ -52,6 +52,7 @@ import com.sk89q.worldedit.world.registry.LegacyMapper;
import java.util.HashMap; import java.util.HashMap;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.stream.Stream;
/** /**
* Parses block input strings. * Parses block input strings.
@ -199,6 +200,12 @@ public class DefaultBlockParser extends InputParser<BaseBlock> {
return blockStates; return blockStates;
} }
@Override
public Stream<String> getSuggestions() {
// TODO Include states
return BlockType.REGISTRY.keySet().stream();
}
private BaseBlock parseLogic(String input, ParserContext context) throws InputParseException { private BaseBlock parseLogic(String input, ParserContext context) throws InputParseException {
BlockType blockType = null; BlockType blockType = null;
Map<Property<?>, Object> blockStates = new HashMap<>(); Map<Property<?>, Object> blockStates = new HashMap<>();

View File

@ -28,7 +28,11 @@ import com.sk89q.worldedit.world.item.ItemType;
import com.sk89q.worldedit.world.item.ItemTypes; import com.sk89q.worldedit.world.item.ItemTypes;
import com.sk89q.worldedit.world.registry.LegacyMapper; import com.sk89q.worldedit.world.registry.LegacyMapper;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class DefaultItemParser extends InputParser<BaseItem> { public class DefaultItemParser extends InputParser<BaseItem> {
@ -36,6 +40,11 @@ public class DefaultItemParser extends InputParser<BaseItem> {
super(worldEdit); super(worldEdit);
} }
@Override
public Stream<String> getSuggestions() {
return ItemType.REGISTRY.keySet().stream();
}
@Override @Override
public BaseItem parseFromInput(String input, ParserContext context) throws InputParseException { public BaseItem parseFromInput(String input, ParserContext context) throws InputParseException {
BaseItem item = null; BaseItem item = null;

View File

@ -36,6 +36,7 @@ import com.sk89q.worldedit.world.registry.BiomeRegistry;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.stream.Stream;
public class BiomeMaskParser extends InputParser<Mask> { public class BiomeMaskParser extends InputParser<Mask> {
@ -43,6 +44,11 @@ public class BiomeMaskParser extends InputParser<Mask> {
super(worldEdit); super(worldEdit);
} }
@Override
public Stream<String> getSuggestions() {
return BiomeType.REGISTRY.keySet().stream().map(biomeType -> "$" + biomeType);
}
@Override @Override
public Mask parseFromInput(String input, ParserContext context) throws InputParseException { public Mask parseFromInput(String input, ParserContext context) throws InputParseException {
if (!input.startsWith("$")) { if (!input.startsWith("$")) {

View File

@ -29,6 +29,7 @@ import com.sk89q.worldedit.session.request.RequestExtent;
import com.sk89q.worldedit.world.block.BlockCategory; import com.sk89q.worldedit.world.block.BlockCategory;
import java.util.Locale; import java.util.Locale;
import java.util.stream.Stream;
public class BlockCategoryMaskParser extends InputParser<Mask> { public class BlockCategoryMaskParser extends InputParser<Mask> {
@ -36,6 +37,11 @@ public class BlockCategoryMaskParser extends InputParser<Mask> {
super(worldEdit); super(worldEdit);
} }
@Override
public Stream<String> getSuggestions() {
return BlockCategory.REGISTRY.keySet().stream().map(str -> "##" + str);
}
@Override @Override
public Mask parseFromInput(String input, ParserContext context) throws InputParseException { public Mask parseFromInput(String input, ParserContext context) throws InputParseException {
if (!input.startsWith("##")) { if (!input.startsWith("##")) {

View File

@ -28,8 +28,10 @@ import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.internal.registry.InputParser; import com.sk89q.worldedit.internal.registry.InputParser;
import com.sk89q.worldedit.session.request.RequestExtent; import com.sk89q.worldedit.session.request.RequestExtent;
import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockCategory;
import java.util.Set; import java.util.Set;
import java.util.stream.Stream;
/** /**
* Parses mask input strings. * Parses mask input strings.
@ -40,6 +42,11 @@ public class BlocksMaskParser extends InputParser<Mask> {
super(worldEdit); super(worldEdit);
} }
@Override
public Stream<String> getSuggestions() {
return worldEdit.getBlockFactory().getSuggestions();
}
@Override @Override
public Mask parseFromInput(String component, ParserContext context) throws InputParseException { public Mask parseFromInput(String component, ParserContext context) throws InputParseException {
ParserContext tempContext = new ParserContext(context); ParserContext tempContext = new ParserContext(context);

View File

@ -52,8 +52,8 @@ public class ExpressionMaskParser extends InputParser<Mask> {
WorldEditExpressionEnvironment env = new WorldEditExpressionEnvironment( WorldEditExpressionEnvironment env = new WorldEditExpressionEnvironment(
new RequestExtent(), Vector3.ONE, Vector3.ZERO); new RequestExtent(), Vector3.ONE, Vector3.ZERO);
exp.setEnvironment(env); exp.setEnvironment(env);
if (context.getActor() instanceof SessionOwner) { if (context.getActor() != null) {
SessionOwner owner = (SessionOwner) context.getActor(); SessionOwner owner = context.getActor();
IntSupplier timeout = () -> WorldEdit.getInstance().getSessionManager().get(owner).getTimeout(); IntSupplier timeout = () -> WorldEdit.getInstance().getSessionManager().get(owner).getTimeout();
return new ExpressionMask(exp, timeout); return new ExpressionMask(exp, timeout);
} }

View File

@ -29,10 +29,9 @@ import com.sk89q.worldedit.internal.registry.InputParser;
import com.sk89q.worldedit.world.block.BlockCategory; import com.sk89q.worldedit.world.block.BlockCategory;
import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockType;
import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Stream;
public class BlockCategoryPatternParser extends InputParser<Pattern> { public class BlockCategoryPatternParser extends InputParser<Pattern> {
@ -41,8 +40,8 @@ public class BlockCategoryPatternParser extends InputParser<Pattern> {
} }
@Override @Override
public List<String> getSuggestions() { public Stream<String> getSuggestions() {
return BlockCategory.REGISTRY.keySet().stream().map(str -> "##" + str).collect(Collectors.toList()); return BlockCategory.REGISTRY.keySet().stream().map(str -> "##" + str);
} }
@Override @Override

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.collect.Lists;
import com.sk89q.worldedit.EmptyClipboardException; import com.sk89q.worldedit.EmptyClipboardException;
import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEdit;
@ -32,7 +31,7 @@ import com.sk89q.worldedit.internal.registry.InputParser;
import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.session.ClipboardHolder; import com.sk89q.worldedit.session.ClipboardHolder;
import java.util.List; import java.util.stream.Stream;
public class ClipboardPatternParser extends InputParser<Pattern> { public class ClipboardPatternParser extends InputParser<Pattern> {
@ -41,8 +40,8 @@ public class ClipboardPatternParser extends InputParser<Pattern> {
} }
@Override @Override
public List<String> getSuggestions() { public Stream<String> getSuggestions() {
return Lists.newArrayList("#clipboard", "#copy"); return Stream.of("#clipboard", "#copy");
} }
@Override @Override

View File

@ -25,6 +25,9 @@ import com.sk89q.worldedit.extension.input.ParserContext;
import com.sk89q.worldedit.function.pattern.BlockPattern; import com.sk89q.worldedit.function.pattern.BlockPattern;
import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.internal.registry.InputParser; import com.sk89q.worldedit.internal.registry.InputParser;
import com.sk89q.worldedit.world.block.BlockType;
import java.util.stream.Stream;
public class SingleBlockPatternParser extends InputParser<Pattern> { public class SingleBlockPatternParser extends InputParser<Pattern> {
@ -32,6 +35,11 @@ public class SingleBlockPatternParser extends InputParser<Pattern> {
super(worldEdit); super(worldEdit);
} }
@Override
public Stream<String> getSuggestions() {
return worldEdit.getBlockFactory().getSuggestions();
}
@Override @Override
public Pattern parseFromInput(String input, ParserContext context) throws InputParseException { public Pattern parseFromInput(String input, ParserContext context) throws InputParseException {
return new BlockPattern(worldEdit.getBlockFactory().parseFromInput(input, context)); return new BlockPattern(worldEdit.getBlockFactory().parseFromInput(input, context));

View File

@ -28,5 +28,5 @@ public interface ExtentPattern extends Pattern {
* *
* @return the extent for this pattern * @return the extent for this pattern
*/ */
public Extent getExtent(); Extent getExtent();
} }

View File

@ -27,8 +27,11 @@ import com.sk89q.worldedit.extension.input.NoMatchException;
import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.extension.input.ParserContext;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/** /**
* An abstract implementation of a factory for internal usage. * An abstract implementation of a factory for internal usage.
@ -76,6 +79,10 @@ public abstract class AbstractFactory<E> {
throw new NoMatchException("No match for '" + input + "'"); throw new NoMatchException("No match for '" + input + "'");
} }
public Stream<String> getSuggestions() {
return parsers.stream().flatMap(InputParser::getSuggestions);
}
/** /**
* Registers an InputParser to this factory * Registers an InputParser to this factory
* *

View File

@ -25,6 +25,7 @@ import com.sk89q.worldedit.extension.input.ParserContext;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.stream.Stream;
/** /**
* Input parser interface for {@link AbstractFactory}. * Input parser interface for {@link AbstractFactory}.
@ -43,11 +44,11 @@ public abstract class InputParser<E> {
public abstract E parseFromInput(String input, ParserContext context) throws InputParseException; public abstract E parseFromInput(String input, ParserContext context) throws InputParseException;
/** /**
* Gets a list of suggestions of input to this parser. * Gets a stream of suggestions of input to this parser.
* *
* @return a list of suggestions * @return a stream of suggestions
*/ */
public List<String> getSuggestions() { public Stream<String> getSuggestions() {
return Collections.emptyList(); return Stream.empty();
} }
} }

View File

@ -25,6 +25,7 @@ import com.sk89q.worldedit.extension.input.InputParseException;
import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.extension.input.ParserContext;
import java.util.List; import java.util.List;
import java.util.stream.Stream;
/** /**
* An input parser that only performs a single function from aliases. * An input parser that only performs a single function from aliases.
@ -65,7 +66,7 @@ public abstract class SimpleInputParser<E> extends InputParser<E> {
} }
@Override @Override
public List<String> getSuggestions() { public Stream<String> getSuggestions() {
return Lists.newArrayList(getPrimaryMatcher()); return Stream.of(getPrimaryMatcher());
} }
} }