Skip to content

Commit

Permalink
Allow typed expansions to be resolved at a later date
Browse files Browse the repository at this point in the history
Signed-off-by: TheSilkMiner <thesilkminer@outlook.com>
  • Loading branch information
TheSilkMiner committed Mar 20, 2022
1 parent a60af3e commit 6a1b4df
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 2 deletions.
Expand Up @@ -89,6 +89,7 @@ public void manageJavaNativeIntegration(final IJavaNativeIntegrationRegistration

this.zenGatherer.listProviders();
this.zenGatherer.onCandidates(candidate -> this.zenClassRegistrationManager.attemptRegistration(candidate.loader(), candidate.clazz(), handler));
this.zenClassRegistrationManager.attemptDeferredRegistration(handler);
}

@Override
Expand Down
@@ -1,6 +1,7 @@
package com.blamejared.crafttweaker.impl.plugin.crafttweaker;

import com.blamejared.crafttweaker.api.annotation.Preprocessor;
import com.blamejared.crafttweaker.api.natives.NativeTypeInfo;
import com.blamejared.crafttweaker.api.plugin.IJavaNativeIntegrationRegistrationHandler;
import com.blamejared.crafttweaker.api.util.InstantiationUtil;
import com.blamejared.crafttweaker.api.zencode.IPreprocessor;
Expand All @@ -10,13 +11,31 @@
import com.blamejared.crafttweaker_annotations.annotations.TypedExpansion;
import org.openzen.zencode.java.ZenCodeType;

import java.util.ArrayDeque;
import java.util.HashMap;
import java.util.Map;
import java.util.Queue;

final class ZenClassRegistrationManager {

@FunctionalInterface
private interface LateCallback {

void callback(final Class<?> clazz, final String loader, final IJavaNativeIntegrationRegistrationHandler handler);

}

private record LateRegistrationCandidate(Class<?> clazz, String loader, LateCallback callback) {}

private final AnnotationsToApiConverters converters;
private final Map<Class<?>, NativeTypeInfo> foundNatives;
private final Queue<LateRegistrationCandidate> lateRegistrations;

ZenClassRegistrationManager() {

this.converters = new AnnotationsToApiConverters();
this.foundNatives = new HashMap<>();
this.lateRegistrations = new ArrayDeque<>();
}

void attemptRegistration(final String loader, final Class<?> clazz, final IJavaNativeIntegrationRegistrationHandler handler) {
Expand All @@ -26,22 +45,30 @@ void attemptRegistration(final String loader, final Class<?> clazz, final IJavaN
this.attemptPreprocessorRegistration(clazz, loader, handler);
}

void attemptDeferredRegistration(final IJavaNativeIntegrationRegistrationHandler handler) {

this.lateRegistrations.forEach(it -> it.callback().callback(it.clazz(), it.loader(), handler));
this.lateRegistrations.clear();
}

private void attemptNativeRegistration(final Class<?> clazz, final String loader, final IJavaNativeIntegrationRegistrationHandler handler) {

final NativeTypeRegistration ntr = clazz.getDeclaredAnnotation(NativeTypeRegistration.class);
if(ntr == null) {
return;
}
final NativeMethod[] methods = clazz.getDeclaredAnnotationsByType(NativeMethod.class);
final NativeTypeInfo nativeTypeInfo = this.converters.toNativeTypeInfo(ntr, methods);

handler.registerNativeType(loader, clazz, this.converters.toNativeTypeInfo(ntr, methods));
this.foundNatives.put(nativeTypeInfo.targetedType(), nativeTypeInfo);
handler.registerNativeType(loader, clazz, nativeTypeInfo);
}

private void attemptZenRegistration(final Class<?> clazz, final String loader, final IJavaNativeIntegrationRegistrationHandler handler) {

this.attemptZenClassRegistration(clazz, loader, handler);
this.attemptZenExpandRegistration(clazz, loader, handler);
this.attemptTypedExpandRegistration(clazz, loader, handler);
this.orFuture(clazz, loader, handler, this::attemptTypedExpandRegistration);
}

private void attemptZenClassRegistration(final Class<?> clazz, final String loader, final IJavaNativeIntegrationRegistrationHandler handler) {
Expand Down Expand Up @@ -92,6 +119,16 @@ private void attemptPreprocessorRegistration(final Class<?> clazz, final String
handler.registerPreprocessor((IPreprocessor) InstantiationUtil.getOrCreateInstance(clazz));
}

private void orFuture(final Class<?> clazz, final String loader, final IJavaNativeIntegrationRegistrationHandler handler, final LateCallback callback) {

try {
callback.callback(clazz, loader, handler);
} catch(final Exception e) {
// Let's try again later: maybe some information is not yet available
this.lateRegistrations.add(new LateRegistrationCandidate(clazz, loader, callback));
}
}

private String figureOutTypedExpansionName(final Class<?> target) {

final NativeTypeRegistration registration = target.getDeclaredAnnotation(NativeTypeRegistration.class);
Expand All @@ -104,6 +141,11 @@ private String figureOutTypedExpansionName(final Class<?> target) {
return name.value();
}

final NativeTypeInfo knownNative = this.foundNatives.get(target);
if(knownNative != null) {
return knownNative.name();
}

return null;
}

Expand Down

0 comments on commit 6a1b4df

Please sign in to comment.