aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-10 11:05:14 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-10 11:05:14 +0100
commit482c93fe786d63dd8263bde262acc76467021169 (patch)
tree00db6c679c6b9a3d206384d2c05ef393ffed147e /src/main/java
parent74b2aa135e2bf1af1ef65476aa03406eaaddd2ab (diff)
Type check named args
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java12
-rw-r--r--src/main/java/org/shedlang/compiler/types/FunctionType.java19
-rw-r--r--src/main/java/org/shedlang/compiler/types/NamedParam.java4
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) {
+}