diff options
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java | 22 |
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() ); |
