diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-10 11:26:30 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-10 11:26:30 +0100 |
| commit | 4310c4a044b9d4477b0a15850b32ec25307613a2 (patch) | |
| tree | 91d8e4ee11c1f6899d1124127a77fe30b752f052 /src/main/java | |
| parent | 95f373076325515dbb3acfb7f9d39fecdd2cf9ef (diff) | |
Check number of positional args
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java | 11 | ||||
| -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.java | 23 |
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; + } +} |
