Skip to content

Commit 01e5d9c

Browse files
committed
Fix issues with JFITI not compiling and just being weird in general.
1 parent 094886f commit 01e5d9c

File tree

4 files changed

+21
-6
lines changed

4 files changed

+21
-6
lines changed

CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/GlobalTypeRegistry.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@
88
import java.util.Collection;
99
import java.util.HashMap;
1010
import java.util.Map;
11+
import java.util.function.Function;
1112

1213
public class GlobalTypeRegistry {
1314
public final ZSPackage stdlib;
1415
// Allows for internalizing any TypeID not defined here.
15-
private final Map<Class<? extends TypeID>, Map<? extends TypeID, ? extends TypeID>> identityMaps = new HashMap<>();
16+
private final Map<Class<?>, Map<?, ? extends TypeID>> identityMaps = new HashMap<>();
1617

1718
private final Map<ArrayTypeID, ArrayTypeID> arrayTypes = new HashMap<>();
1819
private final Map<AssocTypeID, AssocTypeID> assocTypes = new HashMap<>();
@@ -124,6 +125,18 @@ public <T extends TypeID> T internalize(Class<T> clazz, T id) {
124125
}
125126
}
126127

128+
public <ID, TYPE extends TypeID> TYPE internalize(Class<TYPE> typeClass, ID id, Function<ID, TYPE> generator) {
129+
130+
Map<ID, TYPE> identityMap = (Map<ID, TYPE>) identityMaps.computeIfAbsent(typeClass, aClass -> new HashMap<>());
131+
if (identityMap.containsKey(id)) {
132+
return identityMap.get(id);
133+
} else {
134+
TYPE value = generator.apply(id);
135+
identityMap.put(id, value);
136+
return value;
137+
}
138+
}
139+
127140
public Collection<DefinitionTypeID> getDefinitions() {
128141
return definitionTypes.keySet();
129142
}

CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMembers.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,11 @@ public Expression castImplicit(CodePosition position, Expression value, TypeID t
559559
if (type.isOptional() && type.withoutOptional() == toType)
560560
return new CheckNullExpression(position, value);
561561

562+
// TODO What order should these be in?
563+
// To me (Jared), it makes sense that it goes superType -> implementations -> casters, why cast to a supertype if it extends the type?
564+
if (extendsOrImplements(toType))
565+
return new SupertypeCastExpression(position, value, toType);
566+
562567
for (TypeMember<CasterMemberRef> caster : casters) {
563568
if (caster.member.isImplicit() && caster.member.toType == toType)
564569
return caster.member.cast(position, value, implicit);
@@ -567,8 +572,6 @@ public Expression castImplicit(CodePosition position, Expression value, TypeID t
567572
if (implementation.member.implementsType.getNormalized() == toType)
568573
return new InterfaceCastExpression(position, value, implementation.member);
569574
}
570-
if (extendsOrImplements(toType))
571-
return new SupertypeCastExpression(position, value, toType);
572575

573576
return new InvalidExpression(position, toType, CompileExceptionCode.INVALID_CAST, "Could not cast " + this + " to " + toType);
574577
}

JavaIntegration/src/main/java/org/openzen/zencode/java/module/converters/JavaNativeTypeConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ private TypeID loadFunctionalInterface(TypeVariableContext loadContext, Class<?>
318318
getMethodDescriptor(functionalInterfaceMethod),
319319
JavaModifiers.PUBLIC | JavaModifiers.ABSTRACT,
320320
header.getReturnType().isGeneric());
321-
return new JavaFunctionalInterfaceTypeID(typeConversionContext.registry, header, functionalInterfaceMethod, method);
321+
return typeConversionContext.registry.internalize(JavaFunctionalInterfaceTypeID.class, header, functionHeader -> new JavaFunctionalInterfaceTypeID(typeConversionContext.registry, functionHeader, functionalInterfaceMethod, method));
322322
}
323323

324324
@SuppressWarnings("DuplicatedCode")

JavaShared/src/main/java/org/openzen/zenscript/javashared/types/JavaFunctionalInterfaceTypeID.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ public Expression castImplicitFrom(CodePosition position, Expression value) {
6868
}
6969

7070
private JavaFunctionalInterfaceTypeID internalizeHeaderChange(GlobalTypeRegistry registry, FunctionHeader header) {
71-
JavaFunctionalInterfaceTypeID normalizedTypeId = new JavaFunctionalInterfaceTypeID(registry, header, functionalInterfaceMethod, method);
72-
return registry.internalize(JavaFunctionalInterfaceTypeID.class, normalizedTypeId);
71+
return registry.internalize(JavaFunctionalInterfaceTypeID.class, header, functionHeader -> new JavaFunctionalInterfaceTypeID(registry, functionHeader, functionalInterfaceMethod, method));
7372
}
7473
}

0 commit comments

Comments
 (0)