diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-10 11:32:29 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-10 11:32:29 +0100 |
| commit | bf1707367f6c26ced547c3504f267a2c7ca275a4 (patch) | |
| tree | c21897d14740d2d1c02272e948478a3556e60e18 /src/main/java | |
| parent | 4310c4a044b9d4477b0a15850b32ec25307613a2 (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.java | 15 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/errors/MissingNamedArgError.java | 17 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/errors/UnexpectedNamedArgError.java | 17 | ||||
| -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; |
