aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-24 21:24:52 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-24 21:24:52 +0100
commit3fca8824b6ce6f7a654706d9d1c4fef537335a5e (patch)
tree7c0369385d0d7322fea06ccbfd3d0d35a472c670 /src/main/java
parent405fc623d679c0d40a8e4fc031dd4e5e32d5f35f (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.java9
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java31
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()
);