aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-10 11:26:30 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-10 11:26:30 +0100
commit4310c4a044b9d4477b0a15850b32ec25307613a2 (patch)
tree91d8e4ee11c1f6899d1124127a77fe30b752f052 /src/main/java
parent95f373076325515dbb3acfb7f9d39fecdd2cf9ef (diff)
Check number of positional args
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java11
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/errors/UnexpectedTypeError.java (renamed from src/main/java/org/shedlang/compiler/typechecker/UnexpectedTypeError.java)2
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/errors/UnknownVariableError.java (renamed from src/main/java/org/shedlang/compiler/typechecker/UnknownVariableError.java)2
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/errors/WrongNumberOfPositionalArgs.java23
4 files changed, 36 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 e89bdd61..fee93041 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -2,6 +2,9 @@ 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.typesets.TypeSets;
import org.shedlang.compiler.types.FunctionType;
import org.shedlang.compiler.types.Type;
@@ -29,6 +32,14 @@ public class TypeChecker {
TypeCheckerContext context,
FunctionType receiverType
) {
+ if (args.positional().size() != receiverType.positionalParams().size()) {
+ throw new WrongNumberOfPositionalArgs(
+ receiverType.positionalParams().size(),
+ args.positional().size(),
+ args.source()
+ );
+ }
+
var typedPositionalArgs = args.positional().stream()
.map(arg -> typeCheckExpression(arg, context))
.toList();
diff --git a/src/main/java/org/shedlang/compiler/typechecker/UnexpectedTypeError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/UnexpectedTypeError.java
index 51cc6652..02355f2a 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/UnexpectedTypeError.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/errors/UnexpectedTypeError.java
@@ -1,4 +1,4 @@
-package org.shedlang.compiler.typechecker;
+package org.shedlang.compiler.typechecker.errors;
import org.shedlang.compiler.errors.SourceError;
import org.shedlang.compiler.sources.Source;
diff --git a/src/main/java/org/shedlang/compiler/typechecker/UnknownVariableError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/UnknownVariableError.java
index 91ab3fae..bc85c18c 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/UnknownVariableError.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/errors/UnknownVariableError.java
@@ -1,4 +1,4 @@
-package org.shedlang.compiler.typechecker;
+package org.shedlang.compiler.typechecker.errors;
import org.shedlang.compiler.errors.SourceError;
import org.shedlang.compiler.sources.Source;
diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/WrongNumberOfPositionalArgs.java b/src/main/java/org/shedlang/compiler/typechecker/errors/WrongNumberOfPositionalArgs.java
new file mode 100644
index 00000000..723c3f7d
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/typechecker/errors/WrongNumberOfPositionalArgs.java
@@ -0,0 +1,23 @@
+package org.shedlang.compiler.typechecker.errors;
+
+import org.shedlang.compiler.errors.SourceError;
+import org.shedlang.compiler.sources.Source;
+
+public class WrongNumberOfPositionalArgs extends SourceError {
+ private final int expected;
+ private final int actual;
+
+ public WrongNumberOfPositionalArgs(int expected, int actual, Source source) {
+ super("Expected " + expected + " positional arguments but got " + actual, source);
+ this.expected = expected;
+ this.actual = actual;
+ }
+
+ public int expected() {
+ return expected;
+ }
+
+ public int actual() {
+ return actual;
+ }
+}