diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-10-29 21:58:22 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-10-29 21:58:22 +0000 |
| commit | e38dd0cd24e76e91918273b08a6e9ede9d542e93 (patch) | |
| tree | 415e01979607a1691a25486275358fae9057eccf /src/main/java | |
| parent | 59ec0a666ee265e7726cd76f8362d47cdbe28c1d (diff) | |
Infer named param types from hint
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() ); |
