aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-29 11:41:14 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-29 11:41:14 +0000
commitc98a8de3d9cd79b37e8c69a668ebbf2a633423f3 (patch)
tree59f2fe38cd3146cb3d733b865d1bef40afac9814 /src/main/java
parent06fc58bacedc66aa5e142fec7df576e41ecab388 (diff)
Store SumVariant in TypedWhenCaseNode
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedWhenCaseNode.java4
-rw-r--r--src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java2
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java14
-rw-r--r--src/main/java/org/shedlang/compiler/types/SumVariant.java11
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;
+ }
}
}