From 3fca8824b6ce6f7a654706d9d1c4fef537335a5e Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 24 Oct 2023 21:24:52 +0100 Subject: Type check positional params in function types --- .../ast/untyped/UntypedFunctionTypeNode.java | 9 +++++++ .../shedlang/compiler/typechecker/TypeChecker.java | 31 +++++++++++++++++----- 2 files changed, 34 insertions(+), 6 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeNode.java index c2529ad2..a51e317e 100644 --- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeNode.java +++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeNode.java @@ -37,6 +37,15 @@ public record UntypedFunctionTypeNode( ); } + public Builder addPositionalParam(UntypedTypeLevelExpressionNode param) { + return new Builder( + this.positionalParams.plus(param), + this.namedParams, + this.effect, + this.returnType + ); + } + public Builder withEffect(UntypedTypeLevelExpressionNode effect) { return new Builder( this.positionalParams, diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index a3be369a..1af620d8 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -646,15 +646,34 @@ public class TypeChecker { UntypedFunctionTypeNode untyped, TypeCheckerContext context ) { + var positionalParams = untyped.params().positional().stream() + .map(param -> typeCheckTypeLevelExpression( + TypeSets.META_TYPE, + param, + context + ).value()) + .toList(); + + var effect = untyped.effect() + .map(untypedEffect -> typeCheckTypeLevelExpression( + TypeSets.EFFECT, + untypedEffect, + context + ).value()) + .orElse(Effects.NONE); + + var returnType = typeCheckTypeLevelExpression( + TypeSets.META_TYPE, + untyped.returnType(), + context + ).value(); + return new TypedFunctionTypeNode( new FunctionType( + positionalParams, List.of(), - List.of(), - untyped.effect() - .map(untypedEffect -> typeCheckTypeLevelExpression(TypeSets.EFFECT, untypedEffect, context).value()) - .orElse(Effects.NONE), - typeCheckTypeLevelExpression(TypeSets.META_TYPE, untyped.returnType(), context) - .value() + effect, + returnType ), untyped.source() ); -- cgit v1.2.3