From fbe9654480d0d7b50afad2ce249b5874701da1d9 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 5 Nov 2023 20:03:22 +0000 Subject: Throw error if effect field is not handled --- .../typechecker/MissingEffectHandlerFieldError.java | 17 +++++++++++++++++ .../org/shedlang/compiler/typechecker/TypeChecker.java | 8 +++++++- 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/shedlang/compiler/typechecker/MissingEffectHandlerFieldError.java (limited to 'src/main/java') 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, -- cgit v1.2.3