aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-08-27 20:23:30 +0100
committerMichael Williamson <mike@zwobble.org>2023-08-27 20:23:30 +0100
commit96de72e5f761eb4bf07536f4dfe282e2e10a2081 (patch)
tree4b6a3d3ef1afa9216583ebe13dfd28cad22c2b9c /src/main/java
parent71fc5352c8c183b91f540ec1134dda24a32ce26c (diff)
Add type-checking for while nodes
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 3eff92bf..651a4f79 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -559,8 +559,8 @@ public class TypeChecker {
case UntypedVarNode var ->
typeCheckVar(var, context);
- case UntypedWhileNode untypedWhileNode ->
- throw new UnsupportedOperationException("TODO");
+ case UntypedWhileNode while_ ->
+ typeCheckWhile(while_, context);
};
}
@@ -885,4 +885,25 @@ public class TypeChecker {
}
};
}
+
+ private static TypeCheckerResult<TypedFunctionStatementNode> typeCheckWhile(
+ UntypedWhileNode untyped,
+ TypeCheckerContext context
+ ) {
+ var typedConditionResult = typeCheckExpression(untyped.condition(), context);
+ var typedCondition = typedConditionResult.value();
+ context = typedConditionResult.context();
+
+ checkExpressionType(typedCondition, Types.BOOL, context);
+
+ var typedBodyResult = typeCheckBlockNested(untyped.body(), context);
+ var typedBody = typedBodyResult.value();
+ context = typedBodyResult.context();
+
+ return context.toResult(new TypedWhileNode(
+ typedCondition,
+ typedBody,
+ untyped.source()
+ ));
+ }
}