aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2021-03-26 18:49:04 +0800
committershedaniel <daniel@shedaniel.me>2021-03-26 18:49:04 +0800
commit659027baa60c56b5aeab38d4f7c676c37857ec68 (patch)
tree3f2e80521f4c999505eea7dd54503eccc9ec42a9
parent02d1d95dd54285cc1237d1b5016401274a5ae5f0 (diff)
downloadRoughlyEnoughItems-659027baa60c56b5aeab38d4f7c676c37857ec68.tar.gz
RoughlyEnoughItems-659027baa60c56b5aeab38d4f7c676c37857ec68.tar.bz2
RoughlyEnoughItems-659027baa60c56b5aeab38d4f7c676c37857ec68.zip
Improve Search Argument Matching
Signed-off-by: shedaniel <daniel@shedaniel.me>
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/entry/renderer/EntryRenderer.java4
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/gui/Renderer.java4
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/WidgetHolder.java23
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/common/entry/EntryStack.java18
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/common/entry/type/EntryDefinition.java10
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfo.java2
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfoRegistry.java4
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/RecipeBookGridMenuInfo.java11
-rw-r--r--default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java10
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/AlternativeArgument.java4
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java71
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/AlwaysMatchingArgumentType.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentType.java18
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/IdentifierArgumentType.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/RegexArgumentType.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TextArgumentType.java3
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TooltipArgumentType.java15
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java21
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/common/transfer/MenuInfoRegistryImpl.java25
-rwxr-xr-xsrc/main/resources/assets/roughlyenoughitems/lang/en_us.json1
21 files changed, 156 insertions, 96 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/entry/renderer/EntryRenderer.java b/api/src/main/java/me/shedaniel/rei/api/client/entry/renderer/EntryRenderer.java
index 14cbcaa04..9ee60c5f8 100644
--- a/api/src/main/java/me/shedaniel/rei/api/client/entry/renderer/EntryRenderer.java
+++ b/api/src/main/java/me/shedaniel/rei/api/client/entry/renderer/EntryRenderer.java
@@ -29,6 +29,8 @@ import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.client.gui.widgets.Tooltip;
import me.shedaniel.rei.api.common.entry.EntryStack;
import me.shedaniel.rei.impl.ClientInternals;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
@@ -37,9 +39,11 @@ public interface EntryRenderer<T> {
return ClientInternals.getEmptyEntryRenderer();
}
+ @Environment(EnvType.CLIENT)
void render(EntryStack<T> entry, PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta);
@Nullable
+ @Environment(EnvType.CLIENT)
Tooltip getTooltip(EntryStack<T> entry, Point mouse);
@ApiStatus.NonExtendable
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/Renderer.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/Renderer.java
index 09ab18617..22fe2fcb0 100644
--- a/api/src/main/java/me/shedaniel/rei/api/client/gui/Renderer.java
+++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/Renderer.java
@@ -27,12 +27,16 @@ import com.mojang.blaze3d.vertex.PoseStack;
import me.shedaniel.math.Point;
import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.client.gui.widgets.Tooltip;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
import org.jetbrains.annotations.Nullable;
public interface Renderer {
+ @Environment(EnvType.CLIENT)
void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta);
@Nullable
+ @Environment(EnvType.CLIENT)
default Tooltip getTooltip(Point mouse) {
return null;
}
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/WidgetHolder.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/WidgetHolder.java
index 74d66a18a..ef0d90312 100644
--- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/WidgetHolder.java
+++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/WidgetHolder.java
@@ -1,3 +1,26 @@
+/*
+ * This file is licensed under the MIT License, part of Roughly Enough Items.
+ * Copyright (c) 2018, 2019, 2020 shedaniel
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
package me.shedaniel.rei.api.client.gui.widgets;
import net.minecraft.client.gui.components.events.GuiEventListener;
diff --git a/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryStack.java b/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryStack.java
index d251f8a14..07cbe62f7 100644
--- a/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryStack.java
+++ b/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryStack.java
@@ -27,9 +27,11 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.mojang.serialization.Dynamic;
import com.mojang.serialization.JsonOps;
+import me.shedaniel.math.Point;
+import me.shedaniel.rei.api.client.config.ConfigObject;
+import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer;
import me.shedaniel.rei.api.client.gui.Renderer;
import me.shedaniel.rei.api.client.gui.widgets.Tooltip;
-import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer;
import me.shedaniel.rei.api.common.entry.comparison.ComparisonContext;
import me.shedaniel.rei.api.common.entry.type.EntryDefinition;
import me.shedaniel.rei.api.common.entry.type.EntryType;
@@ -122,6 +124,16 @@ public interface EntryStack<T> extends TextRepresentable, Renderer {
throw new UnsupportedOperationException(getType().getId() + " does not support serialization!");
}
+ @Nullable
+ @Environment(EnvType.CLIENT)
+ Tooltip getTooltip(Point mouse, boolean appendModName);
+
+ @Override
+ @Nullable
+ default Tooltip getTooltip(Point mouse) {
+ return getTooltip(mouse, ConfigObject.getInstance().shouldAppendModNames());
+ }
+
EntryDefinition<T> getDefinition();
default EntryType<T> getType() {
@@ -132,6 +144,7 @@ public interface EntryStack<T> extends TextRepresentable, Renderer {
return getDefinition().getValueType();
}
+ @Environment(EnvType.CLIENT)
default EntryRenderer<T> getRenderer() {
EntryRenderer<?> renderer = get(Settings.RENDER).apply(this);
return renderer == null ? EntryRenderer.empty() : renderer.cast();
@@ -144,7 +157,6 @@ public interface EntryStack<T> extends TextRepresentable, Renderer {
EntryStack<T> copy();
- @ApiStatus.Internal
default EntryStack<T> rewrap() {
return copy();
}
@@ -187,8 +199,10 @@ public interface EntryStack<T> extends TextRepresentable, Renderer {
public static final Supplier<Boolean> TRUE = () -> true;
public static final Supplier<Boolean> FALSE = () -> false;
+ @Environment(EnvType.CLIENT)
public static final Function<EntryStack<?>, EntryRenderer<?>> DEFAULT_RENDERER = stack -> stack.getDefinition().getRenderer();
public static final BiFunction<EntryStack<?>, Tooltip, Tooltip> DEFAULT_TOOLTIP_PROCESSOR = (stack, tooltip) -> tooltip;
+ @Environment(EnvType.CLIENT)
public static final Settings<Function<EntryStack<?>, EntryRenderer<?>>> RENDER = new Settings<>(DEFAULT_RENDERER);
@Deprecated
public static final Settings<BiFunction<EntryStack<?>, Tooltip, Tooltip>> TOOLTIP_PROCESSOR = new Settings<>(DEFAULT_TOOLTIP_PROCESSOR);
diff --git a/api/src/main/java/me/shedaniel/rei/api/common/entry/type/EntryDefinition.java b/api/src/main/java/me/shedaniel/rei/api/common/entry/type/EntryDefinition.java
index 146fbc1a8..f08480de1 100644
--- a/api/src/main/java/me/shedaniel/rei/api/common/entry/type/EntryDefinition.java
+++ b/api/src/main/java/me/shedaniel/rei/api/common/entry/type/EntryDefinition.java
@@ -24,8 +24,8 @@
package me.shedaniel.rei.api.common.entry.type;
import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer;
-import me.shedaniel.rei.api.common.entry.EntryStack;
import me.shedaniel.rei.api.common.entry.EntrySerializer;
+import me.shedaniel.rei.api.common.entry.EntryStack;
import me.shedaniel.rei.api.common.entry.comparison.ComparisonContext;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
@@ -36,6 +36,11 @@ import org.jetbrains.annotations.Nullable;
import java.util.Collection;
+/**
+ * A definition of an {@link EntryType}, an interface to provide information from an object type.
+ *
+ * @param <T> the type of entry
+ */
public interface EntryDefinition<T> {
Class<T> getValueType();
@@ -44,7 +49,8 @@ public interface EntryDefinition<T> {
@Environment(EnvType.CLIENT)
EntryRenderer<T> getRenderer();
- @Nullable ResourceLocation getIdentifier(EntryStack<T> entry, T value);
+ @Nullable
+ ResourceLocation getIdentifier(EntryStack<T> entry, T value);
boolean isEmpty(EntryStack<T> entry, T value);
diff --git a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfo.java b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfo.java
index 0a7560a8f..bdb54adbb 100644
--- a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfo.java
+++ b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfo.java
@@ -49,8 +49,6 @@ import java.util.List;
* @see me.shedaniel.rei.api.common.transfer.info.simple.SimpleGridMenuInfo
*/
public interface MenuInfo<T extends AbstractContainerMenu, D extends Display> {
- Class<? extends T> getMenuClass();
-
default RecipeFinderPopulator<T, D> getRecipeFinderPopulator() {
return (context, recipeFinder) -> {
for (StackAccessor inventoryStack : getInventoryStacks(context)) {
diff --git a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfoRegistry.java b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfoRegistry.java
index ce4c2065e..4248a198f 100644
--- a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfoRegistry.java
+++ b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfoRegistry.java
@@ -40,9 +40,9 @@ public interface MenuInfoRegistry extends Reloadable<REIServerPlugin> {
return PluginManager.getServerInstance().get(MenuInfoRegistry.class);
}
- <D extends Display> void register(CategoryIdentifier<D> category, MenuInfo<?, D> menuInfo);
+ <C extends AbstractContainerMenu, D extends Display> void register(CategoryIdentifier<D> category, Class<C> menuClass, MenuInfo<C, D> menuInfo);
<D extends Display> void registerGeneric(Predicate<CategoryIdentifier<?>> categoryPredicate, MenuInfo<?, D> menuInfo);
- <T extends AbstractContainerMenu, D extends Display> MenuInfo<T, D> get(CategoryIdentifier<D> category, Class<T> menuClass);
+ <C extends AbstractContainerMenu, D extends Display> MenuInfo<C, D> get(CategoryIdentifier<D> category, Class<C> menuClass);
}
diff --git a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/RecipeBookGridMenuInfo.java b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/RecipeBookGridMenuInfo.java
index a513c649a..f1a4bb84a 100644
--- a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/RecipeBookGridMenuInfo.java
+++ b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/RecipeBookGridMenuInfo.java
@@ -29,17 +29,6 @@ import net.minecraft.world.inventory.RecipeBookMenu;
import net.minecraft.world.item.ItemStack;
public class RecipeBookGridMenuInfo<T extends RecipeBookMenu<?>, D extends SimpleMenuDisplay> implements SimpleGridMenuInfo<T, D> {
- private final Class<? extends RecipeBookMenu<?>> menuClass;
-
- public RecipeBookGridMenuInfo(Class<T> menuClass) {
- this.menuClass = menuClass;
- }
-
- @Override
- public Class<? extends T> getMenuClass() {
- return (Class<? extends T>) menuClass;
- }
-
@Override
public int getCraftingResultSlotIndex(T menu) {
return menu.getResultSlotIndex();
diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java
index b0788e1a5..3e72b8710 100644
--- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java
+++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java
@@ -106,21 +106,21 @@ public class DefaultPlugin implements BuiltinPlugin, REIServerPlugin {
@Override
public void registerMenuInfo(MenuInfoRegistry registry) {
- registry.register(BuiltinPlugin.CRAFTING, new RecipeBookGridMenuInfo<CraftingMenu, DefaultCraftingDisplay>(CraftingMenu.class) {
+ registry.register(BuiltinPlugin.CRAFTING, CraftingMenu.class,new RecipeBookGridMenuInfo<CraftingMenu, DefaultCraftingDisplay>() {
@Override
public List<List<ItemStack>> getDisplayInputs(MenuInfoContext<CraftingMenu, ?, DefaultCraftingDisplay> context) {
return context.getDisplay().getOrganisedInputEntries(this, context.getMenu());
}
});
- registry.register(BuiltinPlugin.CRAFTING, new RecipeBookGridMenuInfo<InventoryMenu, DefaultCraftingDisplay>(InventoryMenu.class) {
+ registry.register(BuiltinPlugin.CRAFTING, InventoryMenu.class,new RecipeBookGridMenuInfo<InventoryMenu, DefaultCraftingDisplay>() {
@Override
public List<List<ItemStack>> getDisplayInputs(MenuInfoContext<InventoryMenu, ?, DefaultCraftingDisplay> context) {
return context.getDisplay().getOrganisedInputEntries(this, context.getMenu());
}
});
- registry.register(BuiltinPlugin.SMELTING, new RecipeBookGridMenuInfo<>(FurnaceMenu.class));
- registry.register(BuiltinPlugin.SMOKING, new RecipeBookGridMenuInfo<>(SmokerMenu.class));
- registry.register(BuiltinPlugin.BLASTING, new RecipeBookGridMenuInfo<>(BlastFurnaceMenu.class));
+ registry.register(BuiltinPlugin.SMELTING, FurnaceMenu.class, new RecipeBookGridMenuInfo<>());
+ registry.register(BuiltinPlugin.SMOKING, SmokerMenu.class, new RecipeBookGridMenuInfo<>());
+ registry.register(BuiltinPlugin.BLASTING, BlastFurnaceMenu.class, new RecipeBookGridMenuInfo<>());
}
@Override
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java
index fbdee9dda..7e85ff752 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java
@@ -462,7 +462,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt
entry.y.setAs(y - 8);
boolean contains = currentBounds.contains(PointHelper.ofMouse());
- int newIndex = contains ? getReleaseIndex() : Iterables.indexOf(entries.values(), e -> e == entry);
+ int newIndex = contains ? getReleaseIndex() : Math.max(0, Iterables.indexOf(entries.values(), e -> e == entry));
if (entries.size() - 1 <= newIndex) {
Entry remove = this.entries.remove(entry.hashIgnoreAmount());
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/AlternativeArgument.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/AlternativeArgument.java
index 772e02633..9c1f24008 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/AlternativeArgument.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/AlternativeArgument.java
@@ -59,6 +59,10 @@ public class AlternativeArgument extends ForwardingList<Argument<?, ?>> {
return this;
}
+ public boolean isEmpty() {
+ return arguments == null;
+ }
+
public AlternativeArgument build() {
if (arguments == null) return AlternativeArgument.EMPTY;
if (arguments.size() == 1) return new AlternativeArgument(Collections.singletonList(arguments.get(0)));
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java
index 8d5cbb59e..f654ce076 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java
@@ -25,18 +25,14 @@ package me.shedaniel.rei.impl.client.search.argument;
import com.google.common.base.MoreObjects;
import com.google.common.collect.Lists;
-import me.shedaniel.math.Point;
import me.shedaniel.rei.api.client.gui.config.SearchMode;
-import me.shedaniel.rei.api.client.gui.widgets.Tooltip;
import me.shedaniel.rei.api.common.entry.EntryStack;
-import me.shedaniel.rei.api.common.util.CollectionUtils;
import me.shedaniel.rei.impl.client.search.argument.type.AlwaysMatchingArgumentType;
import me.shedaniel.rei.impl.client.search.argument.type.ArgumentType;
import me.shedaniel.rei.impl.client.search.argument.type.ArgumentTypesRegistry;
import me.shedaniel.rei.impl.client.search.result.ArgumentApplicableResult;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
-import net.minecraft.network.chat.Component;
import net.minecraft.util.IntRange;
import net.minecraft.util.Unit;
import org.apache.commons.lang3.StringUtils;
@@ -102,33 +98,23 @@ public class Argument<T, R> {
public static List<CompoundArgument> bakeArguments(String searchTerm, @Nullable ProcessedSink sink) {
List<CompoundArgument> compoundArguments = Lists.newArrayList();
int tokenStartIndex = 0;
- String[] allTokens = StringUtils.splitByWholeSeparatorPreserveAllTokens(searchTerm, "|");
- for (String token : allTokens) {
+ for (String token : StringUtils.splitByWholeSeparatorPreserveAllTokens(searchTerm, "|")) {
Matcher terms = SPLIT_PATTERN.matcher(token);
CompoundArgument.Builder builder = CompoundArgument.builder();
while (terms.find()) {
- String term = MoreObjects.firstNonNull(terms.group(1), terms.group(2));
AlternativeArgument.Builder alternativeBuilder = AlternativeArgument.builder();
for (ArgumentType<?, ?> type : ArgumentTypesRegistry.ARGUMENT_TYPE_LIST) {
- if (type.getSearchMode() == SearchMode.NEVER) continue;
- ArgumentApplicableResult result = type.checkApplicable(term);
-
- if (result.isApplicable()) {
- int group = terms.group(1) != null ? 1 : 2;
- Argument<?, ?> argument = new Argument<>(type, result.getText(), !result.isInverted(),
- terms.start(group) + tokenStartIndex, terms.end(group) + tokenStartIndex, !result.shouldPreserveCasing());
- alternativeBuilder.add(argument);
- if (sink != null) {
- if (group == 1) {
- sink.addQuote(terms.start() + tokenStartIndex);
- if (terms.end() - 1 + tokenStartIndex < searchTerm.length()) {
- sink.addQuote(terms.end() - 1 + tokenStartIndex);
- }
- }
- sink.addPart(argument, result.isUsingGrammar(), result.grammarRanges(), terms.start() + tokenStartIndex);
- }
+ applyArgument(type, searchTerm, terms, tokenStartIndex, alternativeBuilder, true, sink);
+ if (!alternativeBuilder.isEmpty()) {
+ break;
+ }
+ }
+
+ if (alternativeBuilder.isEmpty()) {
+ for (ArgumentType<?, ?> type : ArgumentTypesRegistry.ARGUMENT_TYPE_LIST) {
+ applyArgument(type, searchTerm, terms, tokenStartIndex, alternativeBuilder, false, sink);
}
}
@@ -140,6 +126,11 @@ public class Argument<T, R> {
sink.addSplitter(tokenStartIndex - 1);
}
}
+ prepareSearchFilter(compoundArguments);
+ return compoundArguments;
+ }
+
+ private static void prepareSearchFilter(List<CompoundArgument> compoundArguments) {
for (CompoundArgument arguments : compoundArguments) {
for (AlternativeArgument alternativeArgument : arguments) {
for (Argument<?, ?> argument : alternativeArgument) {
@@ -148,14 +139,35 @@ public class Argument<T, R> {
}
}
}
- return compoundArguments;
+ }
+
+ private static void applyArgument(ArgumentType<?, ?> type, String searchTerm, Matcher terms, int tokenStartIndex, AlternativeArgument.Builder alternativeBuilder, boolean forceGrammar, @Nullable ProcessedSink sink) {
+ String term = MoreObjects.firstNonNull(terms.group(1), terms.group(2));
+ if (type.getSearchMode() == SearchMode.NEVER) return;
+ ArgumentApplicableResult result = type.checkApplicable(term, forceGrammar);
+
+ if (result.isApplicable()) {
+ int group = terms.group(1) != null ? 1 : 2;
+ Argument<?, ?> argument = new Argument<>(type, result.getText(), !result.isInverted(),
+ terms.start(group) + tokenStartIndex, terms.end(group) + tokenStartIndex, !result.shouldPreserveCasing());
+ alternativeBuilder.add(argument);
+ if (sink != null) {
+ if (group == 1) {
+ sink.addQuote(terms.start() + tokenStartIndex);
+ if (terms.end() - 1 + tokenStartIndex < searchTerm.length()) {
+ sink.addQuote(terms.end() - 1 + tokenStartIndex);
+ }
+ }
+ sink.addPart(argument, result.isUsingGrammar(), result.grammarRanges(), terms.start() + tokenStartIndex);
+ }
+ }
}
@ApiStatus.Internal
public static boolean matches(EntryStack<?> stack, List<CompoundArgument> compoundArguments) {
if (compoundArguments.isEmpty()) return true;
Mutable<?> mutable = new MutableObject<>();
-
+
a:
for (CompoundArgument arguments : compoundArguments) {
for (AlternativeArgument argument : arguments) {
@@ -188,13 +200,6 @@ public class Argument<T, R> {
return argumentType.matches((Mutable<B>) data, stack, filter, (T) filterData);
}
- public static String tryGetEntryStackTooltip(EntryStack<?> stack) {
- Tooltip tooltip = stack.getTooltip(new Point());
- if (tooltip != null)
- return CollectionUtils.mapAndJoinToString(tooltip.getText(), Component::getString, "\n");
- return "";
- }
-
public ArgumentType<?, ?> getArgument() {
return argumentType;
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/AlwaysMatchingArgumentType.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/AlwaysMatchingArgumentType.java
index 8c0a3af0d..d64b0d6cb 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/AlwaysMatchingArgumentType.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/AlwaysMatchingArgumentType.java
@@ -52,7 +52,7 @@ public final class AlwaysMatchingArgumentType extends ArgumentType<Unit, Unit> {
}
@Override
- public ArgumentApplicableResult checkApplicable(String text) {
+ public ArgumentApplicableResult checkApplicable(String text, boolean forceGrammar) {
return ArgumentApplicableResult.notApplicable();
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentType.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentType.java
index aa8368967..9aa9882f4 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentType.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentType.java
@@ -54,12 +54,16 @@ public abstract class ArgumentType<T, R> {
return SearchMode.PREFIX;
}
- public ArgumentApplicableResult checkApplicable(String text) {
- ArgumentApplicableResult status = checkApplicable(text, getPrefix());
- if (status.isApplicable()) {
- return status;
- } else if (getSearchMode() == SearchMode.ALWAYS) {
- status = checkApplicable(text, "");
+ public ArgumentApplicableResult checkApplicable(String text, boolean forceGrammar) {
+ String prefix = getPrefix();
+ if (forceGrammar && !prefix.isEmpty()) {
+ ArgumentApplicableResult status = checkApplicable(text, prefix);
+ if (status.isApplicable()) {
+ return status;
+ }
+ }
+ if (!forceGrammar && getSearchMode() == SearchMode.ALWAYS) {
+ ArgumentApplicableResult status = checkApplicable(text, "");
if (status.isApplicable()) {
status.notUsingGrammar();
}
@@ -71,7 +75,7 @@ public abstract class ArgumentType<T, R> {
private ArgumentApplicableResult checkApplicable(String text, String prefix) {
if (prefix == null) return ArgumentApplicableResult.notApplicable();
if (text.startsWith("-" + prefix)) return ArgumentApplicableResult.applyInverted(text.substring(1 + prefix.length())).grammar(0, prefix.length() + 1);
- if (text.startsWith(prefix + "-")) return ArgumentApplicableResult.applyInverted(text.substring(1 + prefix.length())).grammar(0, prefix.length() + 1);
+ if (!prefix.isEmpty() && text.startsWith(prefix + "-")) return ArgumentApplicableResult.applyInverted(text.substring(1 + prefix.length())).grammar(0, prefix.length() + 1);
if (text.startsWith(prefix)) return ArgumentApplicableResult.apply(text.substring(prefix.length())).grammar(0, prefix.length());
return ArgumentApplicableResult.notApplicable();
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/IdentifierArgumentType.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/IdentifierArgumentType.java
index a17bfbcf9..1fd0a8249 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/IdentifierArgumentType.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/IdentifierArgumentType.java
@@ -71,7 +71,7 @@ public final class IdentifierArgumentType extends ArgumentType<Unit, String> {
if (identifier == null) {
data.setValue(EMPTY);
} else {
- String s = identifier.toString();
+ String s = identifier.getPath();
if (s.isEmpty()) {
data.setValue(EMPTY);
} else {
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/RegexArgumentType.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/RegexArgumentType.java
index d8c13007f..566698faa 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/RegexArgumentType.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/RegexArgumentType.java
@@ -50,7 +50,7 @@ public final class RegexArgumentType extends ArgumentType<@Nullable Pattern, Str
}
@Override
- public ArgumentApplicableResult checkApplicable(String text) {
+ public ArgumentApplicableResult checkApplicable(String text, boolean forceGrammar) {
boolean inverted = false;
String matchText = text;
if (matchText.startsWith("-")) {
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TextArgumentType.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TextArgumentType.java
index 347862cd5..a0661c8c0 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TextArgumentType.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TextArgumentType.java
@@ -44,7 +44,8 @@ public final class TextArgumentType extends ArgumentType<Unit, String> {
}
@Override
- public @Nullable String getPrefix() {
+ @Nullable
+ public String getPrefix() {
return "";
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TooltipArgumentType.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TooltipArgumentType.java
index 759e6cdeb..f200c7afa 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TooltipArgumentType.java
+++ b/