aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-29 21:58:22 +0000
committerMichael Williamson <mike@zwobble.org>2023-10-29 21:58:22 +0000
commite38dd0cd24e76e91918273b08a6e9ede9d542e93 (patch)
tree415e01979607a1691a25486275358fae9057eccf /src/main/java
parent59ec0a666ee265e7726cd76f8362d47cdbe28c1d (diff)
Infer named param types from hint
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index eec4a8be..9e37666c 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -688,16 +688,28 @@ public class TypeChecker {
positionalParams.add(param);
}
- var partialSignatureParams = new ArrayList<>(positionalParams);
+ var namedParams = new ArrayList<PartialFunctionSignature.Param>();
for (var namedParam : typedSignature.params().named()) {
- partialSignatureParams.add(new PartialFunctionSignature.Param(
+ var paramHint = functionTypeHint.flatMap(
+ h -> h.namedParams().stream()
+ .filter(p -> p.name().equals(namedParam.name()))
+ .map(p -> p.type())
+ .findFirst()
+ );
+
+ namedParams.add(new PartialFunctionSignature.Param(
namedParam.name(),
- namedParam.type().orElseThrow().value(),
+ namedParam.type()
+ .map(x -> x.value())
+ .or(() -> paramHint)
+ .orElseThrow(),
namedParam.source()
));
}
+ var partialSignatureParams = Lists.concat(positionalParams, namedParams);
+
var effect = functionSignatureToEffect(typedSignature);
var partialSignature = new PartialFunctionSignature(
@@ -718,7 +730,9 @@ public class TypeChecker {
positionalParams.stream()
.map(x -> x.type())
.toList(),
- functionSignatureToNamedParams(typedSignature),
+ namedParams.stream()
+ .map(x -> new NamedParam(x.name(), x.type()))
+ .toList(),
effect,
typedBody.type()
);