From c240d003f4256713dad982f91beaf47b862ce5ad Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 5 Nov 2023 16:17:46 +0000 Subject: Type check body of try node --- .../compiler/ast/untyped/UntypedTryNode.java | 41 ++++++++++++++++++++++ .../shedlang/compiler/typechecker/TypeChecker.java | 23 +++++++++++- 2 files changed, 63 insertions(+), 1 deletion(-) (limited to 'src/main/java') 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 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 body, + UntypedTypeLevelExpressionNode handledEffect, + PVector 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 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 typeCheckUnitLiteral( UntypedUnitLiteralNode untyped, TypeCheckerContext context -- cgit v1.2.3