diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-12-29 11:41:14 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-12-29 11:41:14 +0000 |
| commit | c98a8de3d9cd79b37e8c69a668ebbf2a633423f3 (patch) | |
| tree | 59f2fe38cd3146cb3d733b865d1bef40afac9814 /src | |
| parent | 06fc58bacedc66aa5e142fec7df576e41ecab388 (diff) | |
Store SumVariant in TypedWhenCaseNode
Diffstat (limited to 'src')
8 files changed, 30 insertions, 18 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedWhenCaseNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedWhenCaseNode.java index eb614cfc..c9bb30f9 100644 --- a/src/main/java/org/shedlang/compiler/ast/typed/TypedWhenCaseNode.java +++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedWhenCaseNode.java @@ -1,10 +1,10 @@ package org.shedlang.compiler.ast.typed; import org.shedlang.compiler.sources.Source; -import org.shedlang.compiler.types.StructType; +import org.shedlang.compiler.types.SumVariant; public record TypedWhenCaseNode( - TypedTypeLevelExpressionNode<StructType> caseType, + SumVariant caseType, TypedBlockNode body, Source source ) implements TypedNode { diff --git a/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java b/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java index d61aa192..1ab14ddd 100644 --- a/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java +++ b/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java @@ -716,7 +716,7 @@ public class ShidCodeGen { context = caseBodyResult.context; var switchCase = new ShidSwitch.Case( - whenCase.caseType().value(), + whenCase.caseType().rawType(), caseBody, whenCase.source() ); diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index fd7fa39e..3ca2b5ae 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -2082,14 +2082,14 @@ public class TypeChecker { var handledVariantTypes = new HashSet<Type>(); for (var typedCase : typedCases) { - var caseType = typedCase.caseType().value(); - if (!variantTypes.contains(SumVariant.struct(caseType))) { - throw new UnreachableWhenCaseError(caseType, typedCase.source()); + var caseType = typedCase.caseType(); + if (!variantTypes.contains(caseType)) { + throw new UnreachableWhenCaseError(caseType.type(), typedCase.source()); } - if (handledVariantTypes.contains(caseType)) { - throw new DuplicateWhenCaseError(caseType, typedCase.source()); + if (handledVariantTypes.contains(caseType.type())) { + throw new DuplicateWhenCaseError(caseType.type(), typedCase.source()); } - handledVariantTypes.add(caseType); + handledVariantTypes.add(caseType.type()); } for (var variantType : variantTypes) { @@ -2142,7 +2142,7 @@ public class TypeChecker { context = context.exit(); return context.toResult(new TypedWhenCaseNode( - typedCaseType, + SumVariant.struct(typedCaseType.value()), typedBody, untyped.source() )); diff --git a/src/main/java/org/shedlang/compiler/types/SumVariant.java b/src/main/java/org/shedlang/compiler/types/SumVariant.java index 9ea1c848..74ff287b 100644 --- a/src/main/java/org/shedlang/compiler/types/SumVariant.java +++ b/src/main/java/org/shedlang/compiler/types/SumVariant.java @@ -12,12 +12,18 @@ public sealed interface SumVariant { String describe(); Type type(); + StructType rawType(); record ConstructedStruct(ConstructedType<StructType> type) implements SumVariant { @Override public String describe() { return type.describe(); } + + @Override + public StructType rawType() { + return type.genericType(); + } } record Struct(StructType type) implements SumVariant { @@ -25,5 +31,10 @@ public sealed interface SumVariant { public String describe() { return type.describe(); } + + @Override + public StructType rawType() { + return type; + } } } diff --git a/src/test/java/org/shedlang/compiler/ast/typed/Typed.java b/src/test/java/org/shedlang/compiler/ast/typed/Typed.java index 6ef8df43..b501007e 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/Typed.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/Typed.java @@ -296,7 +296,7 @@ public class Typed { } public static TypedWhenCaseNode whenCase( - TypedTypeLevelExpressionNode<StructType> caseType, + SumVariant caseType, TypedBlockNode body ) { return new TypedWhenCaseNode(caseType, body, Sources.NULL); diff --git a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java index 52813dd4..f01c82c1 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java @@ -421,7 +421,7 @@ public class TypedNodeMatchers { } public static Matcher<TypedWhenCaseNode> isTypedWhenCaseNode( - Matcher<TypedTypeLevelExpressionNode<?>> caseType, + Matcher<SumVariant> caseType, Matcher<TypedBlockNode> body ) { return allOf( diff --git a/src/test/java/org/shedlang/compiler/shid/ShidCodeGenWhenTests.java b/src/test/java/org/shedlang/compiler/shid/ShidCodeGenWhenTests.java index b7529685..e9c243f6 100644 --- a/src/test/java/org/shedlang/compiler/shid/ShidCodeGenWhenTests.java +++ b/src/test/java/org/shedlang/compiler/shid/ShidCodeGenWhenTests.java @@ -3,6 +3,7 @@ package org.shedlang.compiler.shid; import org.junit.jupiter.api.Test; import org.shedlang.compiler.ast.typed.Typed; import org.shedlang.compiler.types.NamespaceName; +import org.shedlang.compiler.types.SumVariant; import org.shedlang.compiler.types.Types; import java.util.List; @@ -20,13 +21,13 @@ public class ShidCodeGenWhenTests { Typed.reference("x"), List.of( Typed.whenCase( - Typed.typeLevelReference("A", Types.struct(NAMESPACE_NAME, "A")), + SumVariant.struct(Types.struct(NAMESPACE_NAME, "A")), Typed.block(List.of( Typed.blockReturn(Typed.stringLiteral("a")) )) ), Typed.whenCase( - Typed.typeLevelReference("B", Types.struct(NAMESPACE_NAME, "B")), + SumVariant.struct(Types.struct(NAMESPACE_NAME, "B")), Typed.block(List.of( Typed.blockReturn(Typed.stringLiteral("b")) )) diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java index a3fc4bab..d0ea43cb 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java @@ -185,13 +185,13 @@ public class TypeCheckerWhenTests { isTypedReferenceNode("x", SUM_TYPE), isSequence( isTypedWhenCaseNode( - isTypedTypeLevelReferenceNode("Variant1", VARIANT_TYPE_1), + equalTo(SumVariant.struct(VARIANT_TYPE_1)), isTypedBlockNode(isSequence( isTypedBlockReturnNode(isTypedStringLiteralNode("a")) )) ), isTypedWhenCaseNode( - isTypedTypeLevelReferenceNode("Variant2", VARIANT_TYPE_2), + equalTo(SumVariant.struct(VARIANT_TYPE_2)), isTypedBlockNode(isSequence( isTypedBlockReturnNode(isTypedStringLiteralNode("b")) )) @@ -324,11 +324,11 @@ public class TypeCheckerWhenTests { isTypedReferenceNode("x", SUM_TYPE), isSequence( isTypedWhenCaseNode( - isTypedTypeLevelReferenceNode("Variant1", VARIANT_TYPE_1), + equalTo(SumVariant.struct(VARIANT_TYPE_1)), has("type", x -> x.type(), equalTo(Types.STRING)) ), isTypedWhenCaseNode( - isTypedTypeLevelReferenceNode("Variant2", VARIANT_TYPE_2), + equalTo(SumVariant.struct(VARIANT_TYPE_2)), has("type", x -> x.type(), equalTo(Types.INT)) ) ) |
