Skip to content

Commit

Permalink
Rework ObjectType to allow Unknown and be easier
Browse files Browse the repository at this point in the history
Signed-off-by: TheSilkMiner <thesilkminer@outlook.com>
  • Loading branch information
TheSilkMiner committed May 4, 2022
1 parent 3221918 commit 76e2fc2
Show file tree
Hide file tree
Showing 11 changed files with 84 additions and 47 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,5 @@ public String toString() {
}

ResourceKey<? extends Registry<T>> id();
Class<T> type();
Class<?> type();
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.blamejared.contenttweaker.core.api.zen.bracket;

import com.blamejared.contenttweaker.core.zen.rt.ResourceLocationNative;
import com.blamejared.contenttweaker.core.api.zen.rt.ResourceLocationNative;
import com.blamejared.crafttweaker.api.util.ParseUtil;
import net.minecraft.ResourceLocationException;
import net.minecraft.resources.ResourceLocation;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import com.blamejared.contenttweaker.core.api.object.ObjectType;
import com.blamejared.contenttweaker.core.api.zen.object.Reference;
import com.blamejared.contenttweaker.core.zen.rt.ReferenceMetaFactory;
import com.blamejared.contenttweaker.core.zen.rt.Unknown;
import com.blamejared.contenttweaker.core.api.zen.rt.Unknown;
import com.blamejared.crafttweaker.api.CraftTweakerAPI;
import com.blamejared.crafttweaker.api.util.ParseUtil;
import com.blamejared.crafttweaker.api.zencode.IScriptLoader;
Expand Down Expand Up @@ -31,32 +31,20 @@
public final class ReferenceExpression<T, U extends Reference<T>> extends ParsedExpression {
private final ObjectType<T> objectType;
private final TypeToken<U> referenceToken;
private final ResourceLocation registryId;
private final ResourceLocation objectId;

public ReferenceExpression(
final CodePosition position,
final ObjectType<T> objectType,
final TypeToken<U> referenceToken,
final ResourceLocation registryId,
final ResourceLocation objectId
) {
super(Objects.requireNonNull(position));
this.objectType = objectType;
this.objectType = Objects.requireNonNull(objectType);
this.referenceToken = checkToken(Objects.requireNonNull(referenceToken));
this.registryId = Objects.requireNonNull(registryId);
this.objectId = Objects.requireNonNull(objectId);
}

public ReferenceExpression(
final CodePosition position,
final ObjectType<T> objectType,
final TypeToken<U> referenceToken,
final ResourceLocation objectId
) {
this(position, Objects.requireNonNull(objectType), referenceToken, objectType.id().location(), objectId);
}

private static <R> TypeToken<R> checkToken(final TypeToken<R> token) {
final Type type = token.getType();
if (!(type instanceof Class<?> || type instanceof ParameterizedType)) {
Expand Down Expand Up @@ -110,7 +98,7 @@ private String buildGenericReferenceName(final IScriptLoader loader, final IZenC
}

private List<ParsedExpression> arguments() {
final ParsedExpression registryId = BracketHelper.locationArgument(this.position, this.registryId);
final ParsedExpression registryId = BracketHelper.locationArgument(this.position, this.objectType.id().location());
final ParsedExpression objectId = BracketHelper.locationArgument(this.position, this.objectId);
return List.of(registryId, objectId);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.blamejared.contenttweaker.core.zen.rt;
package com.blamejared.contenttweaker.core.api.zen.rt;

import com.blamejared.contenttweaker.core.api.ContentTweakerConstants;
import com.blamejared.contenttweaker.core.zen.ContentTweakerZenConstants;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,35 @@
package com.blamejared.contenttweaker.core.zen.rt;
package com.blamejared.contenttweaker.core.api.zen.rt;

import com.blamejared.contenttweaker.core.api.ContentTweakerConstants;
import com.blamejared.contenttweaker.core.api.object.ObjectFactory;
import com.blamejared.contenttweaker.core.api.object.ObjectType;
import com.blamejared.contenttweaker.core.zen.ContentTweakerZenConstants;
import com.blamejared.crafttweaker.api.annotation.ZenRegister;
import com.blamejared.crafttweaker.api.util.GenericUtil;
import org.openzen.zencode.java.ZenCodeType;

import java.util.Objects;

@ZenCodeType.Name(ContentTweakerZenConstants.UNKNOWN_CLASS_MARKER)
@ZenRegister(loaders = ContentTweakerConstants.CONTENT_LOADER_ID)
public final class Unknown {

@ZenCodeType.Name(ContentTweakerZenConstants.UNKNOWN_FACTORY_CLASS_MARKER)
@ZenRegister(loaders = ContentTweakerConstants.CONTENT_LOADER_ID)
public static final class Factory implements ObjectFactory<Unknown> {
public static final Factory INSTANCE = new Factory();
private final ObjectType<?> type;

private Factory() {}
private Factory(final ObjectType<?> type) {
this.type = Objects.requireNonNull(type);
}

public static <T> Unknown.Factory of(final ObjectType<T> type) {
return new Factory(type);
}

@Override
public ObjectType<Unknown> type() {
return null; // Stub
return GenericUtil.uncheck(this.type);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,22 @@
import com.blamejared.contenttweaker.core.api.object.ObjectFactory;
import com.blamejared.contenttweaker.core.api.object.ObjectFactoryMapping;
import com.blamejared.contenttweaker.core.api.object.ObjectType;
import com.blamejared.contenttweaker.core.api.zen.rt.Unknown;
import com.blamejared.contenttweaker.core.util.FreezableMap;
import com.blamejared.crafttweaker.api.util.GenericUtil;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.function.Predicate;

public final class FactoryMappingsRegistry {
private final FreezableMap<ObjectType<?>, ObjectFactoryMapping<?, ?>> factories;
private final Map<ObjectType<?>, ObjectFactoryMapping<?, ?>> unknownFactories;

FactoryMappingsRegistry() {
this.factories = FreezableMap.of();
this.unknownFactories = new HashMap<>();
}

public void registerMappings(final ObjectTypeRegistry objectTypeRegistry, final Map<ObjectType<?>, ObjectFactoryMapping<?, ?>> map) {
Expand All @@ -32,6 +35,21 @@ public void registerMappings(final ObjectTypeRegistry objectTypeRegistry, final
}

public <T, U extends ObjectFactory<T>> ObjectFactoryMapping<T, U> findMappingFor(final ObjectType<T> type) {
return GenericUtil.uncheck(Objects.requireNonNull(this.factories.get(type)));
final ObjectFactoryMapping<T, U> mapping = GenericUtil.uncheck(this.factories.get(type));
return mapping == null? this.createUnknownFactory(type) : mapping;
}

private <T, U extends ObjectFactory<T>> ObjectFactoryMapping<T, U> createUnknownFactory(final ObjectType<T> type) {
return GenericUtil.uncheck(this.unknownFactories.computeIfAbsent(type, it -> new ObjectFactoryMapping<Unknown, Unknown.Factory>() {
@Override
public Class<Unknown.Factory> type() {
return Unknown.Factory.class;
}

@Override
public Unknown.Factory of() {
return Unknown.Factory.of(type);
}
}));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,48 @@

import com.blamejared.contenttweaker.core.api.object.ObjectType;
import com.blamejared.contenttweaker.core.util.FreezableMap;
import com.blamejared.contenttweaker.core.api.zen.rt.Unknown;
import com.blamejared.crafttweaker.api.util.GenericUtil;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceKey;
import org.jetbrains.annotations.Nullable;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;

public final class ObjectTypeRegistry {
private static final class UnknownType<T> implements ObjectType<T> {
private final ResourceKey<? extends Registry<T>> key;

private UnknownType(final ResourceKey<? extends Registry<T>> key) {
this.key = Objects.requireNonNull(key);
}

@Override
public ResourceKey<? extends Registry<T>> id() {
return this.key;
}

@Override
public Class<?> type() {
return Unknown.class;
}

@Override
public String toString() {
return "[%s]{?}".formatted(this.id().location());
}
}

private final FreezableMap<ResourceKey<? extends Registry<?>>, ObjectType<?>> types;
private final Map<ResourceKey<? extends Registry<?>>, ObjectType<?>> unknownTypes;

ObjectTypeRegistry() {
this.types = FreezableMap.of();
this.unknownTypes = new HashMap<>();
}

public void registerTypes(final Map<ResourceKey<? extends Registry<?>>, ObjectType<?>> types) {
Expand All @@ -27,6 +56,11 @@ public <T> ObjectType<T> get(final ResourceKey<? extends Registry<T>> key) {
return GenericUtil.uncheck(this.types.get(key));
}

public <T> ObjectType<T> getOrUnknown(final ResourceKey<? extends Registry<T>> key) {
return Optional.ofNullable(this.get(key))
.orElseGet(() -> GenericUtil.uncheck(this.unknownTypes.computeIfAbsent(key, it -> new UnknownType<>(key))));
}

public Collection<ObjectType<?>> allTypes() {
return this.types.values();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

import java.util.Collection;

// Handles registration of the various objects
public final class Winston implements RegistryButler {
private final Multimap<ObjectType<?>, ObjectHolder<?>> commands;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,15 @@
import com.blamejared.contenttweaker.core.ContentTweakerCore;
import com.blamejared.contenttweaker.core.api.object.ObjectType;
import com.blamejared.contenttweaker.core.api.zen.bracket.BracketHelper;
import com.blamejared.contenttweaker.core.api.zen.rt.Unknown;
import com.blamejared.contenttweaker.core.zen.rt.FactoryMetaFactory;
import com.blamejared.crafttweaker.api.CraftTweakerAPI;
import com.blamejared.crafttweaker.api.util.GenericUtil;
import com.blamejared.crafttweaker.api.util.ParseUtil;
import com.blamejared.crafttweaker.api.zencode.IScriptLoader;
import com.blamejared.crafttweaker.api.zencode.IZenClassRegistry;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.Nullable;
import org.openzen.zencode.shared.CodePosition;
import org.openzen.zencode.shared.CompileException;
import org.openzen.zenscript.codemodel.partial.IPartialExpression;
Expand Down Expand Up @@ -42,7 +41,7 @@ public BracketMetaFactoryExpression(final CodePosition position, final ObjectTyp
public IPartialExpression compile(final ExpressionScope scope) throws CompileException {
final ParsedExpression runtimeClass = ParseUtil.staticMemberExpression(this.position, FactoryMetaFactory.ZEN_NAME);
final ParsedExpression factoryMethod = new ParsedExpressionMember(this.position, runtimeClass, "factory", null);
final ParsedCallArguments arguments = this.type == null? this.abstractCall() : this.concreteCall();
final ParsedCallArguments arguments = this.makeCall();
final ParsedExpression invocation = new ParsedExpressionCall(this.position, factoryMethod, arguments);
return invocation.compile(scope);
}
Expand All @@ -52,11 +51,7 @@ public boolean hasStrongType() {
return true;
}

private ParsedCallArguments abstractCall() {
return ParsedCallArguments.NONE;
}

private ParsedCallArguments concreteCall() throws CompileException {
private ParsedCallArguments makeCall() throws CompileException {
return new ParsedCallArguments(List.of(this.findTypeGeneric(), this.findFactoryGeneric()), List.of(this.findArgument()));
}

Expand Down Expand Up @@ -111,8 +106,7 @@ private <T> ParsedExpression createExpression(final CodePosition position, final
return new BracketMetaFactoryExpression<>(position, this.grabType(registryKey));
}

@Nullable
private <T> ObjectType<T> grabType(final ResourceKey<? extends Registry<T>> registryKey) {
return GenericUtil.uncheck(ContentTweakerCore.core().metaRegistry().objectTypes().get(registryKey));
return ContentTweakerCore.core().metaRegistry().objectTypes().getOrUnknown(registryKey);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,11 @@
import com.blamejared.contenttweaker.core.api.object.ObjectType;
import com.blamejared.contenttweaker.core.api.zen.bracket.BracketHelper;
import com.blamejared.contenttweaker.core.api.zen.bracket.ReferenceExpression;
import com.blamejared.contenttweaker.core.api.zen.object.Reference;
import com.blamejared.crafttweaker.api.util.ParseUtil;
import com.google.gson.reflect.TypeToken;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.Nullable;
import org.openzen.zencode.shared.CodePosition;
import org.openzen.zenscript.lexer.ParseException;
import org.openzen.zenscript.lexer.ZSTokenParser;
Expand Down Expand Up @@ -78,12 +76,12 @@ private ParsedExpression parseModdedModded(final CodePosition position, final St
}

private ParsedExpression createExpression(final CodePosition position, final ResourceLocation registry, final ResourceLocation id) {
return createExpression(position, this.grabType(ResourceKey.createRegistryKey(registry)), registry, id);
return createExpression(position, this.grabType(ResourceKey.createRegistryKey(registry)), id);
}

private <T> ParsedExpression createExpression(final CodePosition position, final ObjectType<T> type, final ResourceLocation registry, final ResourceLocation id) {
private <T> ParsedExpression createExpression(final CodePosition position, final ObjectType<T> type, final ResourceLocation id) {
// Scripts run before registry creation and object registration, so no validation has to be performed
return new ReferenceExpression<>(position, type, new TypeToken<>() {}, registry, id);
return new ReferenceExpression<>(position, type, new TypeToken<>() {}, id);
}

private ParseException fail(final CodePosition position, final String contents) throws ParseException {
Expand All @@ -93,8 +91,7 @@ private ParseException fail(final CodePosition position, final String contents)
throw new ParseException(position, message);
}

@Nullable
private <T> ObjectType<T> grabType(final ResourceKey<? extends Registry<T>> registryKey) {
return ContentTweakerCore.core().metaRegistry().objectTypes().get(registryKey);
return ContentTweakerCore.core().metaRegistry().objectTypes().getOrUnknown(registryKey);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,8 @@ private FactoryMetaFactory() {}
public static <T, U extends ObjectFactory<T>> U factory(final Class<T> reifiedT, final Class<U> reifiedU, final ResourceLocation registryId) {
final MetaRegistry metaRegistry = ContentTweakerCore.core().metaRegistry();
final ResourceKey<? extends Registry<T>> key = ResourceKey.createRegistryKey(registryId);
final ObjectType<T> type = metaRegistry.objectTypes().get(key);
final ObjectType<T> type = metaRegistry.objectTypes().getOrUnknown(key);
final ObjectFactoryMapping<T, U> factoryClass = metaRegistry.factoryMappings().findMappingFor(type);
return factoryClass.of();
}

@ZenCodeType.Method("factory")
public static ObjectFactory<Unknown> factory() {
return Unknown.Factory.INSTANCE;
}
}

0 comments on commit 76e2fc2

Please sign in to comment.