diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-11-05 16:17:46 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-11-05 16:17:46 +0000 |
| commit | c240d003f4256713dad982f91beaf47b862ce5ad (patch) | |
| tree | 88f0aca6295f8d533011c4ffc28604998c8253d6 /src/main/java | |
| parent | 38f3a0a74a6f6b8dd4a3341d76a4e3db7872e084 (diff) | |
Type check body of try node
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/ast/untyped/UntypedTryNode.java | 41 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java | 23 |
2 files changed, 63 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTryNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTryNode.java index b9146bb3..c7906c8a 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTryNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTryNode.java @@ -1,6 +1,9 @@ package org.shedlang.compiler.ast.untyped; +import org.pcollections.PVector; import org.shedlang.compiler.sources.Source; +import org.shedlang.compiler.sources.Sources; +import org.shedlang.compiler.util.P; import java.util.List; @@ -10,4 +13,42 @@ public record UntypedTryNode( List<UntypedFunctionDefinitionNode> handlers, Source source ) implements UntypedExpressionNode { + public static Builder builder() { + return new Builder( + P.vector(), + new UntypedTypeLevelReferenceNode("Effect", Sources.NULL), + P.vector() + ); + } + + public record Builder( + PVector<UntypedFunctionStatementNode> body, + UntypedTypeLevelExpressionNode handledEffect, + PVector<UntypedFunctionDefinitionNode> handlers + ) { + public UntypedTryNode build() { + return new UntypedTryNode( + new UntypedBlockNode(body, Sources.NULL), + handledEffect, + handlers, + Sources.NULL + ); + } + + public Builder addBodyStatement(UntypedFunctionStatementNode statement) { + return new Builder( + this.body.plus(statement), + this.handledEffect, + this.handlers + ); + } + + public Builder withHandledEffect(UntypedTypeLevelReferenceNode handledEffect) { + return new Builder( + this.body, + handledEffect, + this.handlers + ); + } + } } diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index 05e89031..0725c78e 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -468,7 +468,7 @@ public class TypeChecker { typeCheckStringLiteral(untypedStringLiteral, context); case UntypedTryNode untypedTry -> - throw new UnsupportedOperationException("TODO"); + typeCheckTry(untypedTry, context); case UntypedTupleNode untypedTuple -> typeCheckTuple(untypedTuple, context); @@ -1587,6 +1587,27 @@ public class TypeChecker { }; } + private static TypeCheckerResult<TypedTryNode> typeCheckTry( + UntypedTryNode untyped, + TypeCheckerContext context + ) { + var typedBodyResult = typeCheckBlockNested( + untyped.body(), + context + ); + var typedBody = typedBodyResult.value(); + context = typedBodyResult.context(); + + var typedHandledEffect = typeCheckEffect(untyped.handledEffect(), context); + + return context.toResult(new TypedTryNode( + typedBody, + typedHandledEffect, + P.vector(), + untyped.source() + )); + } + private static TypeCheckerResult<TypedExpressionNode> typeCheckUnitLiteral( UntypedUnitLiteralNode untyped, TypeCheckerContext context |
