From 120b830cab1462d76761ee0d26cba7df783dc741 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 5 Nov 2023 19:38:22 +0000 Subject: Check that handled effect is user-defined effect --- .../org/shedlang/compiler/typechecker/TypeChecker.java | 7 +++++++ .../typechecker/errors/NotUserDefinedEffectError.java | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 src/main/java/org/shedlang/compiler/typechecker/errors/NotUserDefinedEffectError.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index 29376e9f..f86ed78f 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -1593,6 +1593,13 @@ public class TypeChecker { ) { var typedHandledEffect = typeCheckEffect(untyped.handledEffect(), context); + if (!(typedHandledEffect.value() instanceof UserDefinedEffect)) { + throw new NotUserDefinedEffectError( + typedHandledEffect.value(), + untyped.handledEffect().source() + ); + } + var declaredVariables = DeclaredVariables.forFunctionStatements( untyped.body().statements(), P.vector() diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/NotUserDefinedEffectError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/NotUserDefinedEffectError.java new file mode 100644 index 00000000..a740dccc --- /dev/null +++ b/src/main/java/org/shedlang/compiler/typechecker/errors/NotUserDefinedEffectError.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.Effect; + +public class NotUserDefinedEffectError extends SourceError { + private final Effect effect; + + public NotUserDefinedEffectError(Effect effect, Source source) { + super("Only user-defined effects can be handled, but was: " + effect.describe(), source); + this.effect = effect; + } + + public Effect effect() { + return effect; + } +} -- cgit v1.2.3