diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-12-02 23:55:03 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-12-02 23:55:42 +0000 |
| commit | 72ce4e94a08baf5d722582e2914bb2074ef7d1a7 (patch) | |
| tree | 8505ac9efc0d5f3f20649b3a5eb731dd9644a2ae /src/main/java | |
| parent | 66463f48226051e8c7ecd5907eb278a7ee8345f0 (diff) | |
Type check break statements
Diffstat (limited to 'src/main/java')
5 files changed, 56 insertions, 2 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedBreakNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedBreakNode.java new file mode 100644 index 00000000..bc7ea34a --- /dev/null +++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedBreakNode.java @@ -0,0 +1,13 @@ +package org.shedlang.compiler.ast.typed; + +import org.shedlang.compiler.sources.Source; + +public record TypedBreakNode( + TypedExpressionNode expression, + Source source +) implements TypedFunctionStatementNode { + @Override + public TypedFunctionStatementBehaviour behaviour() { + return TypedFunctionStatementBehaviour.TERMINATE; + } +} diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionStatementNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionStatementNode.java index a79437ec..82c90eea 100644 --- a/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionStatementNode.java +++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedFunctionStatementNode.java @@ -1,5 +1,5 @@ package org.shedlang.compiler.ast.typed; -public sealed interface TypedFunctionStatementNode extends TypedNode permits TypedAssignNode, TypedBlockReturnNode, TypedExpressionStatementNode, TypedFunctionReturnNode, TypedResumeNode, TypedWhileNode { +public sealed interface TypedFunctionStatementNode extends TypedNode permits TypedAssignNode, TypedBlockReturnNode, TypedBreakNode, TypedExpressionStatementNode, TypedFunctionReturnNode, TypedResumeNode, TypedWhileNode { TypedFunctionStatementBehaviour behaviour(); } diff --git a/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java b/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java index 8c930b29..5ed3ffdb 100644 --- a/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java +++ b/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java @@ -336,6 +336,9 @@ public class ShidCodeGen { case TypedBlockReturnNode blockReturn -> compileBlockReturn(blockReturn, context); + case TypedBreakNode break_ -> + throw new UnsupportedOperationException("TODO"); + case TypedExpressionStatementNode expressionStatement -> compileExpressionStatement(expressionStatement, context); diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index e7052ba3..ae91c3d0 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -280,7 +280,35 @@ public class TypeChecker { UntypedBreakNode untyped, TypeCheckerContext context ) { - throw new UnsupportedOperationException("TODO"); + switch (context.returnTypeState()) { + case ReturnTypeState.Explicit explicit -> { + throw new CannotBreakOutsideOfEffectHandlerMethodError(untyped.source()); + } + case ReturnTypeState.ImplicitUnknown implicitUnknown -> { + throw new CannotBreakOutsideOfEffectHandlerMethodError(untyped.source()); + } + case ReturnTypeState.ImplicitLowerBound implicitLowerBound -> { + throw new CannotBreakOutsideOfEffectHandlerMethodError(untyped.source()); + } + case ReturnTypeState.NotInFunction notInFunction -> { + throw new CannotBreakOutsideOfEffectHandlerMethodError(untyped.source()); + } + case ReturnTypeState.EffectHandler effectHandler -> { + var typedExpressionResult = typeCheckExpressionOptional( + untyped.expression(), + Optional.of(effectHandler.resumeType()), + untyped.source(), + context + ); + var typedExpression = typedExpressionResult.value(); + context = typedExpressionResult.context(); + + return context.toResult(new TypedBreakNode( + typedExpression, + untyped.source() + )); + } + } } private static TypeCheckerResult<TypedExpressionNode> typeCheckCall( diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/CannotBreakOutsideOfEffectHandlerMethodError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/CannotBreakOutsideOfEffectHandlerMethodError.java new file mode 100644 index 00000000..3a32ecaa --- /dev/null +++ b/src/main/java/org/shedlang/compiler/typechecker/errors/CannotBreakOutsideOfEffectHandlerMethodError.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 CannotBreakOutsideOfEffectHandlerMethodError extends SourceError { + public CannotBreakOutsideOfEffectHandlerMethodError(Source source) { + super("Cannot break outside of effect handler method", source); + } +} |
