aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-01 19:51:24 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-01 19:51:24 +0100
commit804500f0aac6253cfd5262038b62667902e195ca (patch)
tree8bacbb7f3e8f77d6f92c1f8fd8f41c8a85b94e9e /src/main/java
parentb0d81e8b2354ffb0efba0f395b4aa4e114fd1579 (diff)
Check all variants are handled
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java16
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/errors/UnhandledVariantError.java18
2 files changed, 32 insertions, 2 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 3b4df564..09a55c08 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -1140,13 +1140,13 @@ public class TypeChecker {
var typedExpression = typedExpressionResult.value();
context = typedExpressionResult.context();
- if (!(typedExpression.type() instanceof SumType)) {
+ if (!(typedExpression.type() instanceof SumType expressionType)) {
throw new WhenExpressionIsNotInstanceOfSumTypeError(
typedExpression.type(),
typedExpression.source()
);
}
-
+
var typedCasesResult = context.mapWithContext(
untyped.cases(),
TypeChecker::typeCheckWhenCase
@@ -1154,6 +1154,18 @@ public class TypeChecker {
var typedCases = typedCasesResult.value();
context = typedCasesResult.context();
+ var expressionTypeInfo = context.sumTypeInfo(expressionType, untyped.source());
+ var variantTypes = expressionTypeInfo.variants();
+ var handledVariantTypes = typedCases.stream()
+ .map(typedCase -> typedCase.caseType().value())
+ .collect(Collectors.toSet());
+
+ for (var variantType : variantTypes) {
+ if (!handledVariantTypes.contains(variantType)) {
+ throw new UnhandledVariantError(variantType, untyped.source());
+ }
+ }
+
var caseBodyTypes = typedCases.stream()
.map(typedCase -> typedCase.body().type())
.toList();
diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/UnhandledVariantError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/UnhandledVariantError.java
new file mode 100644
index 00000000..de30b900
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/typechecker/errors/UnhandledVariantError.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 UnhandledVariantError extends SourceError {
+ private final Type unhandledVariant;
+
+ public UnhandledVariantError(Type unhandledVariant, Source source) {
+ super("The variant " + unhandledVariant.describe() + " is unhandled", source);
+ this.unhandledVariant = unhandledVariant;
+ }
+
+ public Type unhandledVariant() {
+ return unhandledVariant;
+ }
+}