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/main/java | |
| parent | 06fc58bacedc66aa5e142fec7df576e41ecab388 (diff) | |
Store SumVariant in TypedWhenCaseNode
Diffstat (limited to 'src/main/java')
4 files changed, 21 insertions, 10 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; + } } } |
