aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
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()
);