aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-10 11:20:32 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-10 11:20:32 +0100
commit8d9a828fcdaa35b8826c8d3988a8927ea916555c (patch)
tree01643bb90cded539a3dfa2496c1a946de39a4fab /src/main/java
parent646c5b9673ffbbc691db246ca8a253cb3e6ea8a1 (diff)
Check named arg type matched named param type
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index ebfdc0d5..83285f07 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -10,7 +10,7 @@ public class TypeChecker {
private TypeChecker() {
}
- private static void checkIsSubType(TypedExpressionNode expression, Type expectedType, TypeCheckerContext context) {
+ private static void checkExpressionType(TypedExpressionNode expression, Type expectedType, TypeCheckerContext context) {
if (!isSubType(expression.type(), expectedType, context)) {
throw new UnexpectedTypeError(
TypeSets.type(expectedType),
@@ -45,7 +45,16 @@ public class TypeChecker {
var typedArg = typedPositionalArgs.get(i);
var paramType = receiverType.positionalParams().get(i);
- checkIsSubType(typedArg, paramType, context);
+ checkExpressionType(typedArg, paramType, context);
+ }
+
+ for (var typedArg : typedNamedArgs) {
+ var param = receiverType.namedParams().stream()
+ .filter(namedParam -> namedParam.name().equals(typedArg.name()))
+ .findFirst()
+ .orElseThrow();
+
+ checkExpressionType(typedArg.expression(), param.type(), context);
}
return new TypedArgsNode(typedPositionalArgs, typedNamedArgs, args.source());