From e7d00f5a62e0f03161dbc12939840d332dc76506 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 25 Feb 2024 18:48:53 +0000 Subject: Parse type level params in function signature --- .../UntypedFunctionSignatureNodeMatcher.java | 7 ++++ .../parser/ParserFunctionSignatureTests.java | 42 ++++++++++++++++++++++ 2 files changed, 49 insertions(+) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/ast/untyped/UntypedFunctionSignatureNodeMatcher.java b/src/test/java/org/shedlang/compiler/ast/untyped/UntypedFunctionSignatureNodeMatcher.java index 8cd1c638..2059f506 100644 --- a/src/test/java/org/shedlang/compiler/ast/untyped/UntypedFunctionSignatureNodeMatcher.java +++ b/src/test/java/org/shedlang/compiler/ast/untyped/UntypedFunctionSignatureNodeMatcher.java @@ -5,6 +5,7 @@ import org.pcollections.PVector; import org.shedlang.compiler.testing.MatcherBuilder; import org.zwobble.precisely.Matcher; +import java.util.List; import java.util.Optional; import static org.zwobble.precisely.Matchers.*; @@ -59,4 +60,10 @@ public class UntypedFunctionSignatureNodeMatcher extends MatcherBuilder< ) { return with(has("returnType", x -> x.returnType(), returnType)); } + + public UntypedFunctionSignatureNodeMatcher withTypeLevelParams( + Matcher>> typeLevelParams + ) { + return with(has("typeLevelParams", x -> x.typeLevelParams(), typeLevelParams)); + } } diff --git a/src/test/java/org/shedlang/compiler/parser/ParserFunctionSignatureTests.java b/src/test/java/org/shedlang/compiler/parser/ParserFunctionSignatureTests.java index f26efa64..1e639069 100644 --- a/src/test/java/org/shedlang/compiler/parser/ParserFunctionSignatureTests.java +++ b/src/test/java/org/shedlang/compiler/parser/ParserFunctionSignatureTests.java @@ -210,4 +210,46 @@ public class ParserFunctionSignatureTests { .withoutReturnType() ); } + + @Test + public void canParseAbsentTypeLevelParams() { + var source = "() -> Unit"; + + var node = parseString(source, Parser::parseFunctionSignature); + + assertThat( + node, + isUntypedFunctionSignatureNode().withTypeLevelParams(isOptionalEmpty()) + ); + } + + @Test + public void canParseSingleTypeLevelParam() { + var source = "[A]() -> Unit"; + + var node = parseString(source, Parser::parseFunctionSignature); + + assertThat( + node, + isUntypedFunctionSignatureNode().withTypeLevelParams(isOptionalOf(isSequence( + isUntypedTypeLevelParamNode("A") + ))) + ); + } + + @Test + public void canParseManyTypeLevelParams() { + var source = "[A, B, C]() -> Unit"; + + var node = parseString(source, Parser::parseFunctionSignature); + + assertThat( + node, + isUntypedFunctionSignatureNode().withTypeLevelParams(isOptionalOf(isSequence( + isUntypedTypeLevelParamNode("A"), + isUntypedTypeLevelParamNode("B"), + isUntypedTypeLevelParamNode("C") + ))) + ); + } } -- cgit v1.2.3