aboutsummaryrefslogtreecommitdiff
path: root/src
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
parent06fc58bacedc66aa5e142fec7df576e41ecab388 (diff)
Store SumVariant in TypedWhenCaseNode
Diffstat (limited to 'src')
-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
-rw-r--r--src/test/java/org/shedlang/compiler/ast/typed/Typed.java2
-rw-r--r--src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java2
-rw-r--r--src/test/java/org/shedlang/compiler/shid/ShidCodeGenWhenTests.java5
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java8
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))
)
)