aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-01 19:46:22 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-01 19:46:22 +0100
commitb0d81e8b2354ffb0efba0f395b4aa4e114fd1579 (patch)
tree429f0778cd168cd9883ce2c7e0683b305bc553e1 /src/main/java
parent9645a0ee4ea525b97084d1ef26c326201baaf7b4 (diff)
Check when expression is instance of sum type
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java7
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/errors/WhenExpressionIsNotInstanceOfSumTypeError.java18
2 files changed, 25 insertions, 0 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 58396e80..3b4df564 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -1139,6 +1139,13 @@ public class TypeChecker {
var typedExpressionResult = typeCheckExpression(untyped.expression(), context);
var typedExpression = typedExpressionResult.value();
context = typedExpressionResult.context();
+
+ if (!(typedExpression.type() instanceof SumType)) {
+ throw new WhenExpressionIsNotInstanceOfSumTypeError(
+ typedExpression.type(),
+ typedExpression.source()
+ );
+ }
var typedCasesResult = context.mapWithContext(
untyped.cases(),
diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/WhenExpressionIsNotInstanceOfSumTypeError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/WhenExpressionIsNotInstanceOfSumTypeError.java
new file mode 100644
index 00000000..1583c8ae
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/typechecker/errors/WhenExpressionIsNotInstanceOfSumTypeError.java
@@ -0,0 +1,18 @@
+package org.shedlang.compiler.typechecker.errors;
+
+import org.shedlang.compiler.errors.SourceError;
+import org.shedlang.compiler.sources.Source;
+import org.shedlang.compiler.types.Type;
+
+public class WhenExpressionIsNotInstanceOfSumTypeError extends SourceError {
+ private final Type actualType;
+
+ public WhenExpressionIsNotInstanceOfSumTypeError(Type actualType, Source source) {
+ super("when expression must be an instance of a sum type, but was " + actualType.describe(), source);
+ this.actualType = actualType;
+ }
+
+ public Type actualType() {
+ return actualType;
+ }
+}