aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-11-02 23:15:38 +0000
committerMichael Williamson <mike@zwobble.org>2023-11-02 23:15:38 +0000
commitc3a032c9d0ffb0c005f81d4dcba477408142914e (patch)
treed79d13c0f9ad11293c389110e6b4c9fe9fd98b53 /src/main/java
parentc9ffb931adc50091fd86ea9d09c423ab16020416 (diff)
Support type-checking return statements with no expression
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index d00cc352..6dd1a3f3 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -435,6 +435,19 @@ public class TypeChecker {
};
}
+ private static TypeCheckerResult<? extends TypedExpressionNode> typeCheckExpressionOptional(
+ Optional<UntypedExpressionNode> untyped,
+ Optional<Type> hint,
+ Source source,
+ TypeCheckerContext context
+ ) {
+ if (untyped.isPresent()) {
+ return typeCheckExpression(untyped.get(), hint, context);
+ } else {
+ return context.toResult(new TypedUnitLiteralNode(source));
+ }
+ }
+
private static TypeCheckerResult<TypedFunctionStatementNode> typeCheckExpressionStatement(
UntypedExpressionStatementNode untyped,
TypeCheckerContext context
@@ -768,7 +781,12 @@ public class TypeChecker {
TypeCheckerContext context
) {
// TODO: pass return type as hint if available
- var expressionResult = typeCheckExpression(untyped.expression().orElseThrow(), Optional.empty(), context);
+ var expressionResult = typeCheckExpressionOptional(
+ untyped.expression(),
+ Optional.empty(),
+ untyped.source(),
+ context
+ );
var expression = expressionResult.value();
context = expressionResult.context();