From 482c93fe786d63dd8263bde262acc76467021169 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 10 Jun 2023 11:05:14 +0100 Subject: Type check named args --- .../shedlang/compiler/typechecker/TypeChecker.java | 12 +++++++++--- .../org/shedlang/compiler/types/FunctionType.java | 19 +++++++++++++------ .../java/org/shedlang/compiler/types/NamedParam.java | 4 ++++ 3 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/types/NamedParam.java (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 850929c3..d4704a4e 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -4,8 +4,6 @@ import org.shedlang.compiler.ast.typed.*; import org.shedlang.compiler.ast.untyped.*; import org.shedlang.compiler.types.FunctionType; -import java.util.List; - public class TypeChecker { private TypeChecker() { } @@ -15,7 +13,15 @@ public class TypeChecker { .map(arg -> typeCheckExpression(arg, context)) .toList(); - return new TypedArgsNode(typedPositional, List.of(), args.source()); + var typedNamed = args.named().stream() + .map(arg -> new TypedNamedArgNode( + arg.name(), + typeCheckExpression(arg.expression(), context), + arg.source() + )) + .toList(); + + return new TypedArgsNode(typedPositional, typedNamed, args.source()); } public static TypedExpressionNode typeCheckBoolLiteral( diff --git a/src/main/java/org/shedlang/compiler/types/FunctionType.java b/src/main/java/org/shedlang/compiler/types/FunctionType.java index ad0f56d3..22d3487b 100644 --- a/src/main/java/org/shedlang/compiler/types/FunctionType.java +++ b/src/main/java/org/shedlang/compiler/types/FunctionType.java @@ -6,11 +6,12 @@ import org.pcollections.PVector; import java.util.List; public record FunctionType( - List positionalArgs, + List positionalParams, + List namedParams, Type returnType ) implements Type { public static Builder builder() { - return new Builder(Empty.vector(), Types.UNIT); + return new Builder(Empty.vector(), Empty.vector(), Types.UNIT); } @Override @@ -21,18 +22,24 @@ public record FunctionType( public record Builder( PVector positionalParams, + PVector namedParams, Type returnType ) { public FunctionType build() { - return new FunctionType(positionalParams, returnType); + return new FunctionType(positionalParams, namedParams, returnType); } - public Builder addPositionalParam(Type param) { - return new Builder(positionalParams.plus(param), returnType); + public Builder addNamedParam(String name, Type type) { + var namedParam = new NamedParam(name, type); + return new Builder(positionalParams, namedParams.plus(namedParam), returnType); + } + + public Builder addPositionalParam(Type type) { + return new Builder(positionalParams.plus(type), namedParams, returnType); } public Builder withReturnType(Type returnType) { - return new Builder(positionalParams, returnType); + return new Builder(positionalParams, namedParams, returnType); } } } diff --git a/src/main/java/org/shedlang/compiler/types/NamedParam.java b/src/main/java/org/shedlang/compiler/types/NamedParam.java new file mode 100644 index 00000000..799465a9 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/types/NamedParam.java @@ -0,0 +1,4 @@ +package org.shedlang.compiler.types; + +public record NamedParam(String name, Type type) { +} -- cgit v1.2.3