From bf1707367f6c26ced547c3504f267a2c7ca275a4 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 10 Jun 2023 11:32:29 +0100 Subject: Check all named args have been passed --- .../shedlang/compiler/typechecker/TypeChecker.java | 15 +++++++++----- .../typechecker/errors/MissingNamedArgError.java | 17 ++++++++++++++++ .../errors/UnexpectedNamedArgError.java | 17 ++++++++++++++++ .../errors/WrongNumberOfPositionalArgs.java | 23 ---------------------- .../errors/WrongNumberOfPositionalArgsError.java | 23 ++++++++++++++++++++++ 5 files changed, 67 insertions(+), 28 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/typechecker/errors/MissingNamedArgError.java create mode 100644 src/main/java/org/shedlang/compiler/typechecker/errors/UnexpectedNamedArgError.java delete mode 100644 src/main/java/org/shedlang/compiler/typechecker/errors/WrongNumberOfPositionalArgs.java create mode 100644 src/main/java/org/shedlang/compiler/typechecker/errors/WrongNumberOfPositionalArgsError.java (limited to 'src/main/java') 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/WrongNumberOfPositionalArgs.java deleted file mode 100644 index 723c3f7d..00000000 --- a/src/main/java/org/shedlang/compiler/typechecker/errors/WrongNumberOfPositionalArgs.java +++ /dev/null @@ -1,23 +0,0 @@ -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; - } -} diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/WrongNumberOfPositionalArgsError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/WrongNumberOfPositionalArgsError.java new file mode 100644 index 00000000..cf29fd25 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/typechecker/errors/WrongNumberOfPositionalArgsError.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 WrongNumberOfPositionalArgsError extends SourceError { + private final int expected; + private final int actual; + + public WrongNumberOfPositionalArgsError(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; + } +} -- cgit v1.2.3