From df914fb9c7eeee62b050164d95f99bb81b395bc9 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 2 Aug 2026 12:39:49 +0100 Subject: Handle Box and Shared when determining constructibility --- .../compiler/analysis/ArbitraryValueAnalysis.java | 23 +++++++++++++++++++--- .../hobgoblin/compiler/builtins/NativeTypes.java | 12 +++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) (limited to 'src/main/java/org/zwobble') diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/analysis/ArbitraryValueAnalysis.java b/src/main/java/org/zwobble/hobgoblin/compiler/analysis/ArbitraryValueAnalysis.java index d7b3c60..6bc4852 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/analysis/ArbitraryValueAnalysis.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/analysis/ArbitraryValueAnalysis.java @@ -2,6 +2,7 @@ package org.zwobble.hobgoblin.compiler.analysis; import org.zwobble.hobgoblin.compiler.analysis.errors.SumTypeHasNoVariantsError; import org.zwobble.hobgoblin.compiler.analysis.errors.TypeIsInfiniteError; +import org.zwobble.hobgoblin.compiler.builtins.NativeTypes; import org.zwobble.hobgoblin.compiler.typechecker.TypesInfo; import org.zwobble.hobgoblin.compiler.types.*; @@ -31,9 +32,25 @@ public class ArbitraryValueAnalysis { } return switch (type) { - case ConstructedNativeType _ -> - // TODO: Handle Box and Shared - true; + case ConstructedNativeType constructedNativeType -> { + if ( + constructedNativeType.constructor().equals(NativeTypes.BOX) || + constructedNativeType.constructor().equals(NativeTypes.SHARED) + ) { + yield isNonRecursivelyConstructable( + constructedNativeType.args().getFirst(), + seenTypes, + typesInfo + ); + } else if ( + constructedNativeType.constructor().equals(NativeTypes.LIST) || + constructedNativeType.constructor().equals(NativeTypes.OPTION) + ) { + yield true; + } else { + throw new UnsupportedOperationException("TODO"); + } + } case EnumType _ -> true; diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java b/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java index 9d81063..485df8c 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java @@ -29,6 +29,10 @@ public class NativeTypes { LIST_INNER ); + public static Type list(Type elementType) { + return new ConstructedNativeType(LIST, List.of(elementType)); + } + public static final SimpleNativeType OPTION_INNER = SimpleNativeType.builtin("Option"); public static TypeConstructor OPTION = new TypeConstructor<>( @@ -36,10 +40,18 @@ public class NativeTypes { OPTION_INNER ); + public static Type option(Type elementType) { + return new ConstructedNativeType(OPTION, List.of(elementType)); + } + public static final SimpleNativeType SHARED_INNER = SimpleNativeType.builtin("Shared"); public static TypeConstructor SHARED = new TypeConstructor<>( List.of(new TypeParam("T")), SHARED_INNER ); + + public static Type shared(Type elementType) { + return new ConstructedNativeType(SHARED, List.of(elementType)); + } } -- cgit v1.2.3