aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-11-05 16:17:46 +0000
committerMichael Williamson <mike@zwobble.org>2023-11-05 16:17:46 +0000
commitc240d003f4256713dad982f91beaf47b862ce5ad (patch)
tree88f0aca6295f8d533011c4ffc28604998c8253d6 /src/main/java
parent38f3a0a74a6f6b8dd4a3341d76a4e3db7872e084 (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.java41
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java23
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