aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-10 11:32:29 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-10 11:32:29 +0100
commitbf1707367f6c26ced547c3504f267a2c7ca275a4 (patch)
treec21897d14740d2d1c02272e948478a3556e60e18 /src/main/java
parent4310c4a044b9d4477b0a15850b32ec25307613a2 (diff)
Check all named args have been passed
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java15
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/errors/MissingNamedArgError.java17
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/errors/UnexpectedNamedArgError.java17
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/errors/WrongNumberOfPositionalArgsError.java (renamed from src/main/java/org/shedlang/compiler/typechecker/errors/WrongNumberOfPositionalArgs.java)4
4 files changed, 46 insertions, 7 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index fee93041..edfb961c 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -2,9 +2,7 @@ package org.shedlang.compiler.typechecker;
import org.shedlang.compiler.ast.typed.*;
import org.shedlang.compiler.ast.untyped.*;
-import org.shedlang.compiler.typechecker.errors.UnexpectedTypeError;
-import org.shedlang.compiler.typechecker.errors.UnknownVariableError;
-import org.shedlang.compiler.typechecker.errors.WrongNumberOfPositionalArgs;
+import org.shedlang.compiler.typechecker.errors.*;
import org.shedlang.compiler.typechecker.typesets.TypeSets;
import org.shedlang.compiler.types.FunctionType;
import org.shedlang.compiler.types.Type;
@@ -33,7 +31,7 @@ public class TypeChecker {
FunctionType receiverType
) {
if (args.positional().size() != receiverType.positionalParams().size()) {
- throw new WrongNumberOfPositionalArgs(
+ throw new WrongNumberOfPositionalArgsError(
receiverType.positionalParams().size(),
args.positional().size(),
args.source()
@@ -63,11 +61,18 @@ public class TypeChecker {
var param = receiverType.namedParams().stream()
.filter(namedParam -> namedParam.name().equals(typedArg.name()))
.findFirst()
- .orElseThrow();
+ .orElseThrow(() -> new UnexpectedNamedArgError(typedArg.name(), typedArg.source()));
checkExpressionType(typedArg.expression(), param.type(), context);
}
+ for (var namedParam : receiverType.namedParams()) {
+ typedNamedArgs.stream()
+ .filter(namedArg -> namedArg.name().equals(namedParam.name()))
+ .findFirst()
+ .orElseThrow(() -> new MissingNamedArgError(namedParam.name(), args.source()));
+ }
+
return new TypedArgsNode(typedPositionalArgs, typedNamedArgs, args.source());
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/MissingNamedArgError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/MissingNamedArgError.java
new file mode 100644
index 00000000..c39e45df
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/typechecker/errors/MissingNamedArgError.java
@@ -0,0 +1,17 @@
+package org.shedlang.compiler.typechecker.errors;
+
+import org.shedlang.compiler.errors.SourceError;
+import org.shedlang.compiler.sources.Source;
+
+public class MissingNamedArgError extends SourceError {
+ private final String argName;
+
+ public MissingNamedArgError(String argName, Source source) {
+ super("Missing named argument " + argName, source);
+ this.argName = argName;
+ }
+
+ public String argName() {
+ return argName;
+ }
+}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/UnexpectedNamedArgError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/UnexpectedNamedArgError.java
new file mode 100644
index 00000000..0327934f
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/typechecker/errors/UnexpectedNamedArgError.java
@@ -0,0 +1,17 @@
+package org.shedlang.compiler.typechecker.errors;
+
+import org.shedlang.compiler.errors.SourceError;
+import org.shedlang.compiler.sources.Source;
+
+public class UnexpectedNamedArgError extends SourceError {
+ private final String argName;
+
+ public UnexpectedNamedArgError(String argName, Source source) {
+ super("Unexpected named arg " + argName, source);
+ this.argName = argName;
+ }
+
+ public String argName() {
+ return argName;
+ }
+}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/WrongNumberOfPositionalArgs.java b/src/main/java/org/shedlang/compiler/typechecker/errors/WrongNumberOfPositionalArgsError.java
index 723c3f7d..cf29fd25 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/errors/WrongNumberOfPositionalArgs.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/errors/WrongNumberOfPositionalArgsError.java
@@ -3,11 +3,11 @@ package org.shedlang.compiler.typechecker.errors;
import org.shedlang.compiler.errors.SourceError;
import org.shedlang.compiler.sources.Source;
-public class WrongNumberOfPositionalArgs extends SourceError {
+public class WrongNumberOfPositionalArgsError extends SourceError {
private final int expected;
private final int actual;
- public WrongNumberOfPositionalArgs(int expected, int actual, Source source) {
+ public WrongNumberOfPositionalArgsError(int expected, int actual, Source source) {
super("Expected " + expected + " positional arguments but got " + actual, source);
this.expected = expected;
this.actual = actual;