diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-10 15:22:08 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-10 15:22:08 +0100 |
| commit | 0d531b61a74872da604aa35e367392b4f8c59219 (patch) | |
| tree | fb58f311399fbcaf69f18c93e09e7cf1a4e716f3 /src/main/java | |
| parent | e95211da9f73ff0b0bc123ab9d29ef6a0eaf6c67 (diff) | |
Type check function definition params
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java | 22 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java | 35 |
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 |
