From 9d51478ffc90b4b7d059c38cae25beafe63eb40b Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 6 Jun 2023 20:03:43 +0100 Subject: Parse named arguments --- .../shedlang/compiler/ast/UntypedNodeMatchers.java | 10 ++++++ .../shedlang/compiler/parser/ParserCallTests.java | 40 ++++++++++++++++++++++ 2 files changed, 50 insertions(+) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/ast/UntypedNodeMatchers.java b/src/test/java/org/shedlang/compiler/ast/UntypedNodeMatchers.java index 21e8cf1b..3925ec80 100644 --- a/src/test/java/org/shedlang/compiler/ast/UntypedNodeMatchers.java +++ b/src/test/java/org/shedlang/compiler/ast/UntypedNodeMatchers.java @@ -16,6 +16,16 @@ public class UntypedNodeMatchers { return new UntypedCallNodeMatcher(); } + public static Matcher isUntypedNamedArgNode( + String name, + Matcher expression + ) { + return allOf( + has("name", x -> x.name(), equalTo(name)), + has("expression", x -> x.expression(), expression) + ); + } + public static Matcher isUntypedReferenceNode(String name) { return instanceOf( UntypedReferenceNode.class, diff --git a/src/test/java/org/shedlang/compiler/parser/ParserCallTests.java b/src/test/java/org/shedlang/compiler/parser/ParserCallTests.java index 5345414f..1020b430 100644 --- a/src/test/java/org/shedlang/compiler/parser/ParserCallTests.java +++ b/src/test/java/org/shedlang/compiler/parser/ParserCallTests.java @@ -80,6 +80,46 @@ public class ParserCallTests { ); } + @Test + public void canParseCallWithSingleNamedArg() { + var source = "f(.first = a)"; + + var node = parseString(source, Parser::parseTopLevelExpression); + + assertThat( + node, + isUntypedCallNode() + .withArgs( + isUntypedArgsNode() + .withPositional(isSequence()) + .withNamed(isSequence( + isUntypedNamedArgNode("first", isUntypedReferenceNode("a")) + )) + ) + ); + } + + @Test + public void canParseCallWithManyNamedArgs() { + var source = "f(.first = a, .second = b, .third = c)"; + + var node = parseString(source, Parser::parseTopLevelExpression); + + assertThat( + node, + isUntypedCallNode() + .withArgs( + isUntypedArgsNode() + .withPositional(isSequence()) + .withNamed(isSequence( + isUntypedNamedArgNode("first", isUntypedReferenceNode("a")), + isUntypedNamedArgNode("second", isUntypedReferenceNode("b")), + isUntypedNamedArgNode("third", isUntypedReferenceNode("c")) + )) + ) + ); + } + @Test public void argumentListCanHaveTrailingComma() { var source = "f(a,)"; -- cgit v1.2.3