diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-10-24 21:24:52 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-10-24 21:24:52 +0100 |
| commit | 3fca8824b6ce6f7a654706d9d1c4fef537335a5e (patch) | |
| tree | 7c0369385d0d7322fea06ccbfd3d0d35a472c670 /src/main/java | |
| parent | 405fc623d679c0d40a8e4fc031dd4e5e32d5f35f (diff) | |
Type check positional params in function types
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeNode.java | 9 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java | 31 |
2 files changed, 34 insertions, 6 deletions
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() ); |
