Skip to content

Commit

Permalink
fix backwards compat
Browse files Browse the repository at this point in the history
  • Loading branch information
brachy84 committed Jun 17, 2024
1 parent 8b14b61 commit 790001b
Show file tree
Hide file tree
Showing 3 changed files with 161 additions and 16 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package com.cleanroommc.groovyscript.api;

import com.cleanroommc.groovyscript.mapper.ObjectMappers;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.registries.IForgeRegistry;
import net.minecraftforge.registries.IForgeRegistryEntry;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;

import java.util.Locale;
import java.util.Map;
import java.util.function.Function;

/**
Expand All @@ -15,27 +20,51 @@
@FunctionalInterface
public interface IGameObjectParser<T> extends IObjectParser<T> {

static <T extends IForgeRegistryEntry<T>> IObjectParser<T> wrapForgeRegistry(IForgeRegistry<T> forgeRegistry) {
return IObjectParser.wrapForgeRegistry(forgeRegistry);
static <T extends IForgeRegistryEntry<T>> IGameObjectParser<T> wrapForgeRegistry(IForgeRegistry<T> forgeRegistry) {
return (s, args) -> {
Result<ResourceLocation> rl = ObjectMappers.parseResourceLocation(s, args);
if (rl.hasError()) return Result.error(rl.getError());
T value = forgeRegistry.getValue(rl.getValue());
return value == null ? Result.error() : Result.some(value);
};
}

static <T extends Enum<T>> IObjectParser<T> wrapEnum(Class<T> enumClass, boolean caseSensitive) {
return IObjectParser.wrapEnum(enumClass, caseSensitive);
static <T extends Enum<T>> IGameObjectParser<T> wrapEnum(Class<T> enumClass, boolean caseSensitive) {
Map<String, T> map = new Object2ObjectOpenHashMap<>();
for (T t : enumClass.getEnumConstants()) {
map.put(caseSensitive ? t.name() : t.name().toUpperCase(Locale.ROOT), t);
}
return (s, args) -> {
T t = map.get(caseSensitive ? s : s.toUpperCase(Locale.ROOT));
return t == null ? Result.error() : Result.some(t);
};
}

static <T> IObjectParser<T> wrapStringGetter(Function<String, T> getter) {
return IObjectParser.wrapStringGetter(getter);
static <T> IGameObjectParser<T> wrapStringGetter(Function<String, T> getter) {
return wrapStringGetter(getter, false);
}

static <T> IObjectParser<T> wrapStringGetter(Function<String, T> getter, boolean isUpperCase) {
return IObjectParser.wrapStringGetter(getter, isUpperCase);
static <T> IGameObjectParser<T> wrapStringGetter(Function<String, T> getter, boolean isUpperCase) {
return (s, args) -> {
if (args.length > 0) {
return Result.error("extra arguments are not allowed");
}
T t = getter.apply(isUpperCase ? s.toUpperCase(Locale.ROOT) : s);
return t == null ? Result.error() : Result.some(t);
};
}

static <T, V> IObjectParser<T> wrapStringGetter(Function<String, V> getter, Function<V, @NotNull T> trueTypeFunction) {
return IObjectParser.wrapStringGetter(getter, trueTypeFunction);
static <T, V> IGameObjectParser<T> wrapStringGetter(Function<String, V> getter, Function<V, @NotNull T> trueTypeFunction) {
return wrapStringGetter(getter, trueTypeFunction, false);
}

static <T, V> IObjectParser<T> wrapStringGetter(Function<String, V> getter, Function<V, @NotNull T> trueTypeFunction, boolean isUpperCase) {
return IObjectParser.wrapStringGetter(getter, trueTypeFunction, isUpperCase);
static <T, V> IGameObjectParser<T> wrapStringGetter(Function<String, V> getter, Function<V, @NotNull T> trueTypeFunction, boolean isUpperCase) {
return (s, args) -> {
if (args.length > 0) {
return Result.error("extra arguments are not allowed");
}
V v = getter.apply(isUpperCase ? s.toUpperCase(Locale.ROOT) : s);
return v == null ? Result.error() : Result.some(trueTypeFunction.apply(v));
};
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.cleanroommc.groovyscript.gameobjects;

import org.eclipse.lsp4j.CompletionItem;
import org.eclipse.lsp4j.CompletionItemKind;
import org.jetbrains.annotations.ApiStatus;

import java.util.function.Function;
Expand All @@ -12,10 +13,29 @@
public interface Completer extends com.cleanroommc.groovyscript.mapper.Completer {

static <V> Completer ofNamed(Supplier<Iterable<V>> values, Function<V, String> toString, int preferredParamIndex) {
return (Completer) com.cleanroommc.groovyscript.mapper.Completer.ofNamed(values, toString, preferredParamIndex);
return ofValues(values, v -> {
String s = toString.apply(v);
if (s != null) {
var item = new CompletionItem(toString.apply(v));
item.setKind(CompletionItemKind.Constant);
return item;
}
return null;
}, preferredParamIndex);
}

static <V> Completer ofValues(Supplier<Iterable<V>> values, Function<V, CompletionItem> toCompletionItem, int preferredParamIndex) {
return (Completer) com.cleanroommc.groovyscript.mapper.Completer.ofValues(values, toCompletionItem, preferredParamIndex);
return (paramIndex, items) -> {
if (preferredParamIndex < 0 || preferredParamIndex == paramIndex) {
items.addAll(values.get(), toCompletionItem);
}
};
}

default Completer and(com.cleanroommc.groovyscript.mapper.Completer other) {
return (paramIndex, items) -> {
complete(paramIndex, items);
other.complete(paramIndex, items);
};
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,110 @@
package com.cleanroommc.groovyscript.gameobjects;

import com.cleanroommc.groovyscript.api.IGameObjectParser;
import com.cleanroommc.groovyscript.api.IObjectParser;
import com.cleanroommc.groovyscript.api.Result;
import com.cleanroommc.groovyscript.compat.mods.GroovyContainer;
import com.cleanroommc.groovyscript.mapper.Completer;
import com.cleanroommc.groovyscript.mapper.ObjectMapper;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.registries.IForgeRegistry;
import net.minecraftforge.registries.IForgeRegistryEntry;
import org.jetbrains.annotations.ApiStatus;

import java.util.function.Function;
import java.util.function.Supplier;

@Deprecated
@ApiStatus.ScheduledForRemoval(inVersion = "1.2.0")
public class GameObjectHandler<T> {

@ApiStatus.Internal
public static <T> ObjectMapper.Builder<T> builder(String name, Class<T> returnTpe) {
return ObjectMapper.builder(name, returnTpe);
public static <T> Builder<T> builder(String name, Class<T> returnTpe) {
return new Builder<>(name, returnTpe);
}

public static class Builder<T> extends ObjectMapper.Builder<T> {

public Builder(String name, Class<T> returnType) {
super(name, returnType);
}

@Override
public Builder<T> mod(String mod) {
return (Builder<T>) super.mod(mod);
}

@Override
public Builder<T> mod(GroovyContainer<?> mod) {
return (Builder<T>) super.mod(mod);
}

@Override
public Builder<T> parser(IObjectParser<T> handler) {
return (Builder<T>) super.parser(handler);
}

public Builder<T> parser(IGameObjectParser<T> handler) {
return (Builder<T>) super.parser(handler);
}

@Override
public Builder<T> completer(Completer completer) {
return (Builder<T>) super.completer(completer);
}

public Builder<T> completer(com.cleanroommc.groovyscript.gameobjects.Completer completer) {
return (Builder<T>) super.completer(completer);
}

@Override
public Builder<T> completerOfNames(Supplier<Iterable<String>> values) {
return (Builder<T>) super.completerOfNames(values);
}

@Override
public <V> Builder<T> completerOfNamed(Supplier<Iterable<V>> values, Function<V, String> toString) {
return (Builder<T>) super.completerOfNamed(values, toString);
}

@Override
public <V extends Enum<V>> Builder<T> completerOfEnum(Class<V> values, boolean caseSensitive) {
return (Builder<T>) super.completerOfEnum(values, caseSensitive);
}

@Override
public Builder<T> completer(Supplier<Iterable<ResourceLocation>> values) {
return (Builder<T>) super.completer(values);
}

@Override
public <V extends IForgeRegistryEntry<V>> Builder<T> completer(IForgeRegistry<V> values) {
return (Builder<T>) super.completer(values);
}

@Override
public Builder<T> defaultValue(Supplier<T> defaultValue) {
return (Builder<T>) super.defaultValue(defaultValue);
}

@Override
public Builder<T> defaultValueSup(Supplier<Result<T>> defaultValue) {
return (Builder<T>) super.defaultValueSup(defaultValue);
}

@Override
public Builder<T> addSignature(Class<?>... paramTypes) {
return (Builder<T>) super.addSignature(paramTypes);
}

@Override
public Builder<T> documentation(String doc) {
return (Builder<T>) super.documentation(doc);
}

@Override
public Builder<T> docOfType(String type) {
return (Builder<T>) super.docOfType(type);
}
}
}

0 comments on commit 790001b

Please sign in to comment.