aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/moe/nea/firmament/init/Intermediary.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/moe/nea/firmament/init/Intermediary.java')
-rw-r--r--src/main/java/moe/nea/firmament/init/Intermediary.java115
1 files changed, 62 insertions, 53 deletions
diff --git a/src/main/java/moe/nea/firmament/init/Intermediary.java b/src/main/java/moe/nea/firmament/init/Intermediary.java
index 61494d7..3513a6b 100644
--- a/src/main/java/moe/nea/firmament/init/Intermediary.java
+++ b/src/main/java/moe/nea/firmament/init/Intermediary.java
@@ -7,57 +7,66 @@ import org.objectweb.asm.Type;
import java.util.List;
public class Intermediary {
- private static final MappingResolver RESOLVER = FabricLoader.getInstance().getMappingResolver();
-
- static String methodName(Object object) {
- throw new AssertionError("Cannot be called at runtime");
- }
-
- static <T> String className() {
- throw new AssertionError("Cannot be called at runtime");
- }
-
- static String id(String source) {
- return source;
- }
-
-// public record Class(
-// Type intermediaryClass
-// ) {
-// public Class(String intermediaryClass) {
-// this(Type.getObjectType(intermediaryClass.replace('.', '/')));
-// }
-//
-// public String getMappedName() {
-// return RESOLVER.mapClassName("intermediary", intermediaryClass.getInternalName()
-// .replace('/', '.'));
-// }
-// }
-//
-// public record Method(
-// Type intermediaryClassName,
-// String intermediaryMethodName,
-// Type intermediaryReturnType,
-// List<Type> intermediaryArgumentTypes
-// ) {
-// public Method(
-// String intermediaryClassName,
-// String intermediaryMethodName,
-// String intermediaryReturnType,
-// String... intermediaryArgumentTypes
-// ) {
-// this(intermediaryClassName, intermediaryMethodName, intermediaryReturnType, List.of(intermediaryArgumentTypes));
-// }
-//
-// public String getMappedMethodName() {
-// return RESOLVER.mapMethodName("intermediary",
-// intermediaryClassName.getInternalName().replace('/', '.'));
-// }
-//
-// public Type getIntermediaryDescriptor() {
-// return Type.getMethodType(intermediaryReturnType, intermediaryArgumentTypes.toArray(Type[]::new));
-// }
-//
-//
-// }
+ private static final MappingResolver RESOLVER = FabricLoader.getInstance().getMappingResolver();
+
+ static InterMethod intermediaryMethod(Object object, InterClass returnType, InterClass... args) {
+ throw new AssertionError("Cannot be called at runtime");
+ }
+
+ static <T> InterClass intermediaryClass() {
+ throw new AssertionError("Cannot be called at runtime");
+ }
+
+ public static InterClass ofIntermediaryClass(String interClass) {
+ return new InterClass(Type.getObjectType(interClass.replace('.', '/')));
+ }
+
+ public static InterClass ofClass(Class<?> unmappedClass) {
+ return new InterClass(Type.getType(unmappedClass));
+ }
+
+ public static InterMethod ofMethod(String intermediary, String ownerType, InterClass returnType, InterClass... argTypes) {
+ return new InterMethod(intermediary, ofIntermediaryClass(ownerType), returnType, List.of(argTypes));
+ }
+
+ public record InterClass(
+ Type intermediary
+ ) {
+ public Type mapped() {
+ if (intermediary().getSort() != Type.OBJECT)
+ return intermediary();
+ return Type.getObjectType(RESOLVER.mapClassName("intermediary", intermediary().getClassName())
+ .replace('.', '/'));
+ }
+ }
+
+ public record InterMethod(
+ String intermediary,
+ InterClass ownerType,
+ InterClass returnType,
+ List<InterClass> argumentTypes
+ ) {
+ public Type intermediaryDesc() {
+ return Type.getMethodType(
+ returnType.intermediary(),
+ argumentTypes().stream().map(InterClass::intermediary).toArray(Type[]::new)
+ );
+ }
+
+ public Type mappedDesc() {
+ return Type.getMethodType(
+ returnType.mapped(),
+ argumentTypes().stream().map(InterClass::mapped).toArray(Type[]::new)
+ );
+ }
+
+ public String mapped() {
+ return RESOLVER.mapMethodName(
+ "intermediary",
+ ownerType.intermediary().getClassName(),
+ intermediary(),
+ intermediaryDesc().getDescriptor()
+ );
+ }
+ }
}