aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-24 21:21:29 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-24 21:21:29 +0100
commit405fc623d679c0d40a8e4fc031dd4e5e32d5f35f (patch)
tree0607ce5c6f321b7c6044094a7991663a19eccd4c /src/main/java
parentb18304ac527691bb778ca467cfef17805a4d85a7 (diff)
Type-check effect in function types
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeNode.java11
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java4
2 files changed, 13 insertions, 2 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 ca8404e3..c2529ad2 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionTypeNode.java
@@ -37,7 +37,16 @@ public record UntypedFunctionTypeNode(
);
}
- public Builder withReturnType(UntypedTypeLevelReferenceNode returnType) {
+ public Builder withEffect(UntypedTypeLevelExpressionNode effect) {
+ return new Builder(
+ this.positionalParams,
+ this.namedParams,
+ Optional.of(effect),
+ this.returnType
+ );
+ }
+
+ public Builder withReturnType(UntypedTypeLevelExpressionNode returnType) {
return new Builder(
this.positionalParams,
this.namedParams,
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index aeed2edd..a3be369a 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -650,7 +650,9 @@ public class TypeChecker {
new FunctionType(
List.of(),
List.of(),
- Effects.NONE,
+ untyped.effect()
+ .map(untypedEffect -> typeCheckTypeLevelExpression(TypeSets.EFFECT, untypedEffect, context).value())
+ .orElse(Effects.NONE),
typeCheckTypeLevelExpression(TypeSets.META_TYPE, untyped.returnType(), context)
.value()
),