aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-01 19:57:15 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-01 19:57:15 +0100
commit0138badca3abaeca2ea40405cad3788c5048c36e (patch)
tree6ba7a999b959c4a10f9d78cf817b71b569addd53 /src/main/java/org
parent804500f0aac6253cfd5262038b62667902e195ca (diff)
Check variant is valid
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java8
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/errors/UnreachableWhenCaseError.java18
2 files changed, 26 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 09a55c08..d38c5ac1 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -1156,6 +1156,14 @@ public class TypeChecker {
var expressionTypeInfo = context.sumTypeInfo(expressionType, untyped.source());
var variantTypes = expressionTypeInfo.variants();
+
+ for (var typedCase : typedCases) {
+ var caseType = typedCase.caseType().value();
+ if (!variantTypes.contains(caseType)) {
+ throw new UnreachableWhenCaseError(caseType, typedCase.source());
+ }
+ }
+
var handledVariantTypes = typedCases.stream()
.map(typedCase -> typedCase.caseType().value())
.collect(Collectors.toSet());
diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/UnreachableWhenCaseError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/UnreachableWhenCaseError.java
new file mode 100644
index 00000000..803d22ea
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/typechecker/errors/UnreachableWhenCaseError.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 UnreachableWhenCaseError extends SourceError {
+ private final Type caseType;
+
+ public UnreachableWhenCaseError(Type caseType, Source source) {
+ super("The case for " + caseType.describe() + " is unreachable", source);
+ this.caseType = caseType;
+ }
+
+ public Type caseType() {
+ return caseType;
+ }
+}