diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-11-07 16:55:48 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-11-07 17:01:03 +0000 |
| commit | e450be55c05a6bb1eda4e49595b50cf776e6e6d6 (patch) | |
| tree | aa9df2324f110012df0d67d5c68ad46ed5233547 /src/main/java | |
| parent | 68ee7079071ea7d64fcc71f28dfadc1cba447454 (diff) | |
Disallow returns in effect handlers
Diffstat (limited to 'src/main/java')
3 files changed, 21 insertions, 0 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/ReturnTypeState.java b/src/main/java/org/shedlang/compiler/typechecker/ReturnTypeState.java index bb96cfa7..b43b17ea 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/ReturnTypeState.java +++ b/src/main/java/org/shedlang/compiler/typechecker/ReturnTypeState.java @@ -14,8 +14,13 @@ public sealed interface ReturnTypeState { return new ImplicitLowerBound(type); } + static ReturnTypeState effectHandler(Type resumeType) { + return new EffectHandler(resumeType); + } + record NotInFunction() implements ReturnTypeState {} record Explicit(Type type) implements ReturnTypeState {} record ImplicitUnknown() implements ReturnTypeState {} record ImplicitLowerBound(Type type) implements ReturnTypeState {} + record EffectHandler(Type resumeType) implements ReturnTypeState {} } diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index 4cf49b47..756e4584 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -618,6 +618,9 @@ public class TypeChecker { // TODO: better error throw new IllegalStateException(); } + case ReturnTypeState.EffectHandler effectHandler -> { + returnType = effectHandler.resumeType(); + } } // TODO: get free variables on exit? @@ -847,6 +850,9 @@ public class TypeChecker { // reasonable error. throw new CannotReturnOutsideOfFunctionError(returnValueSource); } + case ReturnTypeState.EffectHandler effectHandler -> { + throw new CannotReturnFromEffectHandlerFieldError(returnValueSource); + } }; return context; diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/CannotReturnFromEffectHandlerFieldError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/CannotReturnFromEffectHandlerFieldError.java new file mode 100644 index 00000000..e887f353 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/typechecker/errors/CannotReturnFromEffectHandlerFieldError.java @@ -0,0 +1,10 @@ +package org.shedlang.compiler.typechecker.errors; + +import org.shedlang.compiler.errors.SourceError; +import org.shedlang.compiler.sources.Source; + +public class CannotReturnFromEffectHandlerFieldError extends SourceError { + public CannotReturnFromEffectHandlerFieldError(Source source) { + super("Cannot return from effect handler field", source); + } +} |
