From e38dd0cd24e76e91918273b08a6e9ede9d542e93 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 29 Oct 2023 21:58:22 +0000 Subject: Infer named param types from hint --- .../shedlang/compiler/typechecker/TypeChecker.java | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'src/main/java') 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(); 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() ); -- cgit v1.2.3