Start work on modularising masks and patterns

This commit is contained in:
Matthew Miller
2018-12-23 18:56:26 +10:00
parent d6977aeae4
commit c5d9aadab8
20 changed files with 557 additions and 122 deletions

View File

@ -21,12 +21,14 @@ package com.sk89q.worldedit.internal.registry;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.collect.Lists;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.extension.input.InputParseException;
import com.sk89q.worldedit.extension.input.NoMatchException;
import com.sk89q.worldedit.extension.input.ParserContext;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
@ -38,7 +40,7 @@ import java.util.List;
public abstract class AbstractFactory<E> {
protected final WorldEdit worldEdit;
protected final List<InputParser<E>> parsers = new ArrayList<>();
private final List<InputParser<E>> parsers = new ArrayList<>();
/**
* Create a new factory.
@ -50,6 +52,17 @@ public abstract class AbstractFactory<E> {
this.worldEdit = worldEdit;
}
/**
* Gets an immutable list of parsers.
*
* To add parsers, use the register method.
*
* @return the parsers
*/
public List<InputParser<E>> getParsers() {
return Collections.unmodifiableList(parsers);
}
public E parseFromInput(String input, ParserContext context) throws InputParseException {
E match;
@ -64,4 +77,14 @@ public abstract class AbstractFactory<E> {
throw new NoMatchException("No match for '" + input + "'");
}
/**
* Registers an InputParser to this factory
*
* @param inputParser The input parser
*/
public void register(InputParser<E> inputParser) {
checkNotNull(inputParser);
parsers.add(inputParser);
}
}

View File

@ -19,10 +19,13 @@
package com.sk89q.worldedit.internal.registry;
import com.google.common.collect.Lists;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.extension.input.InputParseException;
import com.sk89q.worldedit.extension.input.ParserContext;
import java.util.List;
/**
* Input parser interface for {@link AbstractFactory}.
*
@ -33,10 +36,18 @@ public abstract class InputParser<E> {
protected final WorldEdit worldEdit;
protected InputParser(WorldEdit worldEdit) {
public InputParser(WorldEdit worldEdit) {
this.worldEdit = worldEdit;
}
public abstract E parseFromInput(String input, ParserContext context) throws InputParseException;
/**
* Gets a list of suggestions of input to this parser.
*
* @return a list of suggestions
*/
public List<String> getSuggestions() {
return Lists.newArrayList();
}
}

View File

@ -0,0 +1,71 @@
/*
* WorldEdit, a Minecraft world manipulation toolkit
* Copyright (C) sk89q <http://www.sk89q.com>
* Copyright (C) WorldEdit team and contributors
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the
* Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldedit.internal.registry;
import com.google.common.collect.Lists;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.extension.input.InputParseException;
import com.sk89q.worldedit.extension.input.ParserContext;
import java.util.List;
/**
* An input parser that only performs a single function from aliases.
*
* @param <E> the element
*/
public abstract class SimpleInputParser<E> extends InputParser<E> {
public SimpleInputParser(WorldEdit worldEdit) {
super(worldEdit);
}
/**
* The strings this parser matches
*
* @return the matching aliases
*/
public abstract List<String> getMatchedAliases();
@Override
public E parseFromInput(String input, ParserContext context) throws InputParseException {
if (!getMatchedAliases().contains(input)) {
return null;
}
return parseFromSimpleInput(input, context);
}
public abstract E parseFromSimpleInput(String input, ParserContext context) throws InputParseException;
/**
* Gets the primary name of this matcher
*
* @return the primary match
*/
public String getPrimaryMatcher() {
return getMatchedAliases().get(0);
}
@Override
public List<String> getSuggestions() {
return Lists.newArrayList(getPrimaryMatcher());
}
}