Skip to content

Commit e2f086a

Browse files
authored
Merge pull request #124 from ZenCodeLang/bugfix/JFITI-issues
Fix issues with JFITI not compiling and just being weird in general.
2 parents 58bbc6a + deadd22 commit e2f086a

File tree

4 files changed

+25
-10
lines changed

4 files changed

+25
-10
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: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -559,16 +559,19 @@ public Expression castImplicit(CodePosition position, Expression value, TypeID t
559559
if (type.isOptional() && type.withoutOptional() == toType)
560560
return new CheckNullExpression(position, value);
561561

562-
for (TypeMember<CasterMemberRef> caster : casters) {
563-
if (caster.member.isImplicit() && caster.member.toType == toType)
564-
return caster.member.cast(position, value, implicit);
565-
}
562+
if (extendsOrImplements(toType))
563+
return new SupertypeCastExpression(position, value, toType);
564+
566565
for (TypeMember<ImplementationMemberRef> implementation : implementations) {
567566
if (implementation.member.implementsType.getNormalized() == toType)
568567
return new InterfaceCastExpression(position, value, implementation.member);
569568
}
570-
if (extendsOrImplements(toType))
571-
return new SupertypeCastExpression(position, value, toType);
569+
570+
for (TypeMember<CasterMemberRef> caster : casters) {
571+
if (caster.member.isImplicit() && caster.member.toType == toType)
572+
return caster.member.cast(position, value, implicit);
573+
}
574+
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)