diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-11-05 20:03:22 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-11-05 20:03:22 +0000 |
| commit | fbe9654480d0d7b50afad2ce249b5874701da1d9 (patch) | |
| tree | 904ce61f47260f685f7e5829a128b5d5884a2cd1 /src/main/java | |
| parent | aa88533bb9809fd9cc597d0b6fc7676b35f1ede2 (diff) | |
Throw error if effect field is not handled
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/MissingEffectHandlerFieldError.java | 17 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java | 8 |
2 files changed, 24 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/MissingEffectHandlerFieldError.java b/src/main/java/org/shedlang/compiler/typechecker/MissingEffectHandlerFieldError.java new file mode 100644 index 00000000..468ca23d --- /dev/null +++ b/src/main/java/org/shedlang/compiler/typechecker/MissingEffectHandlerFieldError.java @@ -0,0 +1,17 @@ +package org.shedlang.compiler.typechecker; + +import org.shedlang.compiler.errors.SourceError; +import org.shedlang.compiler.sources.Source; + +public class MissingEffectHandlerFieldError extends SourceError { + private final String fieldName; + + public MissingEffectHandlerFieldError(String fieldName, Source source) { + super("Missing effect handler field: " + fieldName, source); + this.fieldName = fieldName; + } + + public String fieldName() { + return fieldName; + } +} diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index db81d7cc..44842599 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -1602,7 +1602,7 @@ public class TypeChecker { ) { var typedHandledEffect = typeCheckEffect(untyped.handledEffect(), context); - if (!(typedHandledEffect.value() instanceof UserDefinedEffect)) { + if (!(typedHandledEffect.value() instanceof UserDefinedEffect handledEffect)) { throw new NotUserDefinedEffectError( typedHandledEffect.value(), untyped.handledEffect().source() @@ -1623,6 +1623,12 @@ public class TypeChecker { context = context.exit(); + var effectInfo = context.userDefinedEffectInfo(handledEffect, typedHandledEffect.source()); + // TODO: Don't create unnecessary list + for (var field : effectInfo.fields().stream().toList()) { + throw new MissingEffectHandlerFieldError(field.getKey(), untyped.source()); + } + return context.toResult(new TypedTryNode( typedBody, typedHandledEffect, |
