diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-10 11:05:14 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-10 11:05:14 +0100 |
| commit | 482c93fe786d63dd8263bde262acc76467021169 (patch) | |
| tree | 00db6c679c6b9a3d206384d2c05ef393ffed147e /src/main/java | |
| parent | 74b2aa135e2bf1af1ef65476aa03406eaaddd2ab (diff) | |
Type check named args
Diffstat (limited to 'src/main/java')
3 files changed, 26 insertions, 9 deletions
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<Type> positionalArgs, + List<Type> positionalParams, + List<NamedParam> 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<Type> positionalParams, + PVector<NamedParam> 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) { +} |
