From cec6afb8be6b8a040a2483e621646fd6890b50c1 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 19 Jun 2026 18:55:14 +0100 Subject: Store enum variants in TypesInfo --- .../JavaPreciselyMatchersGenerator.java | 2 +- .../generators/javatypes/JavaTypesGenerator.java | 2 +- .../compiler/typechecker/TypeChecker.java | 6 ++++++ .../typechecker/TypeCheckerGlobalContext.java | 12 ++++++++--- .../typechecker/TypeCheckerNamespaceContext.java | 17 +++++++++++---- .../hobgoblin/compiler/typechecker/TypesInfo.java | 24 +++++++++++++--------- .../hobgoblin/compiler/types/EnumVariant.java | 4 ++++ 7 files changed, 48 insertions(+), 19 deletions(-) create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/types/EnumVariant.java (limited to 'src/main/java') diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java index bc29ab9..8cd8b40 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javapreciselymatchers/JavaPreciselyMatchersGenerator.java @@ -275,7 +275,7 @@ public class JavaPreciselyMatchersGenerator implements Generator { } public List variants(SumType type) { - return this.typesInfo.variants(type); + return this.typesInfo.sumVariants(type); } } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java index bb073b6..bd56880 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java @@ -452,7 +452,7 @@ public class JavaTypesGenerator implements Generator { } public List variants(SumType type) { - return this.typesInfo.variants(type); + return this.typesInfo.sumVariants(type); } } } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java index ed4ad54..5003e3a 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java @@ -125,6 +125,12 @@ public class TypeChecker { )) .toList(); + var enumVariants = untyped.variants().stream() + .map(untypedVariantNode -> new EnumVariant(untypedVariantNode.name())) + .toList(); + + context.defineEnumType(enumType, enumVariants); + return new TypedEnumDefinitionNode( enumType, typedVariantNodes, diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerGlobalContext.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerGlobalContext.java index ff6cd5e..3e7665c 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerGlobalContext.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerGlobalContext.java @@ -7,9 +7,10 @@ import java.util.*; public class TypeCheckerGlobalContext { private final Map nativeTypes = new HashMap<>(); + private final Map> enumVariants = new HashMap<>(); private final Map> structFieldsOf = new HashMap<>(); private final Map namespaceFieldsOf = new HashMap<>(); - private final ManyToMany variants = new ManyToMany<>(); + private final ManyToMany sumVariants = new ManyToMany<>(); public static TypeCheckerGlobalContext initial() { return new TypeCheckerGlobalContext(); @@ -19,7 +20,11 @@ public class TypeCheckerGlobalContext { } public TypesInfo toTypesInfo() { - return new TypesInfo(this.structFieldsOf, this.variants); + return new TypesInfo( + this.enumVariants, + this.structFieldsOf, + this.sumVariants + ); } public void addNativeType(SimpleNativeType type) { @@ -34,8 +39,9 @@ public class TypeCheckerGlobalContext { return TypeCheckerNamespaceContext.initial( namespaceName, this.nativeTypes, + this.enumVariants, this.structFieldsOf, - this.variants + this.sumVariants ); } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceContext.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceContext.java index 69827a8..906cdfa 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceContext.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceContext.java @@ -12,12 +12,14 @@ public class TypeCheckerNamespaceContext { public static TypeCheckerNamespaceContext initial( NamespaceName namespaceName, Map nativeTypes, + Map> enumVariants, Map> fieldsOf, ManyToMany variants ) { return new TypeCheckerNamespaceContext( namespaceName, new HashMap<>(nativeTypes), + enumVariants, fieldsOf, variants ); @@ -25,19 +27,22 @@ public class TypeCheckerNamespaceContext { private final NamespaceName namespaceName; private final Map variables; + private final Map> enumVariants; private final Map> fieldsOf; - private final ManyToMany variants; + private final ManyToMany sumVariants; private TypeCheckerNamespaceContext( NamespaceName namespaceName, Map variables, + Map> enumVariants, Map> fieldsOf, - ManyToMany variants + ManyToMany sumVariants ) { this.namespaceName = namespaceName; this.variables = variables; + this.enumVariants = enumVariants; this.fieldsOf = fieldsOf; - this.variants = variants; + this.sumVariants = sumVariants; } public NamespaceName namespaceName() { @@ -53,13 +58,17 @@ public class TypeCheckerNamespaceContext { return Optional.ofNullable(this.variables.get(name)); } + public void defineEnumType(EnumType enumType, List enumVariants) { + this.enumVariants.put(enumType, enumVariants); + } + public void defineStructType(StructType structType, List fields) { this.fieldsOf.put(structType, fields); } public void defineSumType(SumType sumType, List variantTypes) { for (var variantType : variantTypes) { - this.variants.add(sumType, variantType); + this.sumVariants.add(sumType, variantType); } } } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfo.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfo.java index e64a4b8..0fb4f81 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfo.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfo.java @@ -1,9 +1,6 @@ package org.zwobble.hobgoblin.compiler.typechecker; -import org.zwobble.hobgoblin.compiler.types.Field; -import org.zwobble.hobgoblin.compiler.types.StructType; -import org.zwobble.hobgoblin.compiler.types.SumType; -import org.zwobble.hobgoblin.compiler.types.Type; +import org.zwobble.hobgoblin.compiler.types.*; import org.zwobble.hobgoblin.compiler.util.ManyToMany; import java.util.List; @@ -11,15 +8,22 @@ import java.util.Map; import java.util.Optional; public class TypesInfo { + private final Map> enumVariants; private final Map> structFieldsOf; - private final ManyToMany variants; + private final ManyToMany sumVariants; public TypesInfo( + Map> enumVariants, Map> structFieldsOf, - ManyToMany variants + ManyToMany sumVariants ) { + this.enumVariants = enumVariants; this.structFieldsOf = structFieldsOf; - this.variants = variants; + this.sumVariants = sumVariants; + } + + public List enumVariants(EnumType enumType) { + return this.enumVariants.get(enumType); } public List fieldsOf(StructType structType) { @@ -28,10 +32,10 @@ public class TypesInfo { } public List variantOf(StructType variantType) { - return this.variants.rightToLeft(variantType); + return this.sumVariants.rightToLeft(variantType); } - public List variants(SumType type) { - return this.variants.leftToRight(type); + public List sumVariants(SumType type) { + return this.sumVariants.leftToRight(type); } } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/EnumVariant.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/EnumVariant.java new file mode 100644 index 0000000..2297a64 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/EnumVariant.java @@ -0,0 +1,4 @@ +package org.zwobble.hobgoblin.compiler.types; + +public record EnumVariant(String name) { +} -- cgit v1.2.3