aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-10 15:15:20 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-10 15:15:20 +0100
commite95211da9f73ff0b0bc123ab9d29ef6a0eaf6c67 (patch)
tree4685e5cc2c8949a084b940570508f4a7e954dcda /src
parentd4e6e270b038e721f7eba92d8dbcfe95ab1b31dd (diff)
Type-check function body
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java11
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java8
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java21
3 files changed, 38 insertions, 2 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java
index 7cdaca92..1292c029 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java
@@ -67,5 +67,16 @@ public record UntypedFunctionDefinitionNode(
body
);
}
+
+ public Builder addStatement(UntypedFunctionStatementNode statement) {
+ return new Builder(
+ name,
+ positionalParams,
+ namedParams,
+ effect,
+ returnType,
+ body.plus(statement)
+ );
+ }
}
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index f03de967..f5d3f728 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -170,18 +170,22 @@ public class TypeChecker {
) {
var typedReturnType = typeCheckTypeLevelExpression(TypeSets.META_TYPE, untyped.returnType(), context);
+ var body = untyped.body().stream()
+ .map(statement -> typeCheckFunctionStatement(statement, context))
+ .toList();
+
return new TypedFunctionDefinitionNode(
untyped.name(),
new TypedParamsNode(List.of(), List.of(), untyped.params().source()),
Optional.empty(),
typedReturnType,
- List.of(),
+ body,
untyped.source()
);
}
public static TypedFunctionStatementNode typeCheckFunctionStatement(
- UntypedExpressionStatementNode untyped,
+ UntypedFunctionStatementNode untyped,
TypeCheckerContext context
) {
return switch (untyped) {
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java
index 88027a69..889698ac 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java
@@ -35,4 +35,25 @@ public class TypeCheckerFunctionDefinitionTests {
.withBody(isSequence())
);
}
+
+ @Test
+ public void bodyIsTypeChecked() {
+ var untyped = UntypedFunctionDefinitionNode.builder()
+ .withName("f")
+ .withReturnType(Untyped.typeLevelReference("Unit"))
+ .addStatement(Untyped.expressionStatement(Untyped.stringLiteral("hello")))
+ .build();
+ var context = TypeCheckerContext.EMPTY
+ .enter(P.map(Map.entry("Unit", Types.metaType(Types.UNIT))));
+
+ var typed = TypeChecker.typeCheckNamespaceStatement(untyped, context);
+
+ assertThat(
+ typed,
+ isTypedFunctionDefinitionNode()
+ .withBody(isSequence(
+ isTypedExpressionStatementNode(isTypedStringLiteralNode("hello"))
+ ))
+ );
+ }
}