aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-01 20:00:00 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-01 20:00:00 +0100
commit93ea163fa445b9c4b185b20f2a5c221081bff873 (patch)
tree08c7afb587fcb46a5c16d5b83c3b2e2376c52ec2 /src/main/java
parent0138badca3abaeca2ea40405cad3788c5048c36e (diff)
Check for duplicate cases
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java9
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/errors/DuplicateWhenCaseError.java18
2 files changed, 23 insertions, 4 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index d38c5ac1..d11cf4c0 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -1156,18 +1156,19 @@ public class TypeChecker {
var expressionTypeInfo = context.sumTypeInfo(expressionType, untyped.source());
var variantTypes = expressionTypeInfo.variants();
+ var handledVariantTypes = new HashSet<Type>();
for (var typedCase : typedCases) {
var caseType = typedCase.caseType().value();
if (!variantTypes.contains(caseType)) {
throw new UnreachableWhenCaseError(caseType, typedCase.source());
}
+ if (handledVariantTypes.contains(caseType)) {
+ throw new DuplicateWhenCaseError(caseType, typedCase.source());
+ }
+ handledVariantTypes.add(caseType);
}
- 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());
diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/DuplicateWhenCaseError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/DuplicateWhenCaseError.java
new file mode 100644
index 00000000..6197479e
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/typechecker/errors/DuplicateWhenCaseError.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 DuplicateWhenCaseError extends SourceError {
+ private final Type caseType;
+
+ public DuplicateWhenCaseError(Type caseType, Source source) {
+ super("The case for " + caseType.describe() + " has already been handled", source);
+ this.caseType = caseType;
+ }
+
+ public Type caseType() {
+ return caseType;
+ }
+}