aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-10 15:22:08 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-10 15:22:08 +0100
commit0d531b61a74872da604aa35e367392b4f8c59219 (patch)
treefb58f311399fbcaf69f18c93e09e7cf1a4e716f3 /src/main/java
parente95211da9f73ff0b0bc123ab9d29ef6a0eaf6c67 (diff)
Type check function definition params
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java22
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java35
2 files changed, 53 insertions, 4 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 1292c029..57c02568 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java
@@ -57,6 +57,28 @@ public record UntypedFunctionDefinitionNode(
);
}
+ public Builder addPositionalParam(String name, UntypedTypeLevelExpressionNode type) {
+ return new Builder(
+ name,
+ positionalParams.plus(new UntypedParamNode(name, type, Sources.NULL)),
+ namedParams,
+ effect,
+ returnType,
+ body
+ );
+ }
+
+ public Builder addNamedParam(String name, UntypedTypeLevelExpressionNode type) {
+ return new Builder(
+ name,
+ positionalParams,
+ namedParams.plus(new UntypedParamNode(name, type, Sources.NULL)),
+ effect,
+ returnType,
+ body
+ );
+ }
+
public Builder withReturnType(UntypedTypeLevelExpressionNode returnType) {
return new Builder(
name,
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index f5d3f728..c6875d1b 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -12,7 +12,6 @@ import org.shedlang.compiler.types.TypeLevelValue;
import org.shedlang.compiler.types.TypeLevelValueType;
import java.util.HashSet;
-import java.util.List;
import java.util.Optional;
public class TypeChecker {
@@ -168,18 +167,20 @@ public class TypeChecker {
UntypedFunctionDefinitionNode untyped,
TypeCheckerContext context
) {
+ var typedParams = typeCheckParams(untyped.params(), context);
+
var typedReturnType = typeCheckTypeLevelExpression(TypeSets.META_TYPE, untyped.returnType(), context);
- var body = untyped.body().stream()
+ var typedBody = untyped.body().stream()
.map(statement -> typeCheckFunctionStatement(statement, context))
.toList();
return new TypedFunctionDefinitionNode(
untyped.name(),
- new TypedParamsNode(List.of(), List.of(), untyped.params().source()),
+ typedParams,
Optional.empty(),
typedReturnType,
- body,
+ typedBody,
untyped.source()
);
}
@@ -213,6 +214,32 @@ public class TypeChecker {
};
}
+ private static TypedParamNode typeCheckParam(
+ UntypedParamNode untyped,
+ TypeCheckerContext context
+ ) {
+ return new TypedParamNode(
+ untyped.name(),
+ typeCheckTypeLevelExpression(TypeSets.META_TYPE, untyped.type(), context),
+ untyped.source()
+ );
+ }
+
+ private static TypedParamsNode typeCheckParams(
+ UntypedParamsNode untyped,
+ TypeCheckerContext context
+ ) {
+ var typedPositional = untyped.positional().stream()
+ .map(param -> typeCheckParam(param, context))
+ .toList();
+
+ var typedNamed = untyped.named().stream()
+ .map(param -> typeCheckParam(param, context))
+ .toList();
+
+ return new TypedParamsNode(typedPositional, typedNamed, untyped.source());
+ }
+
private static TypedReferenceNode typeCheckReference(
UntypedReferenceNode untyped,
TypeCheckerContext context