diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-10-29 16:30:22 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-10-29 16:30:22 +0000 |
| commit | 4981c362227679caabbe7178b1e54f6aaa6c84c0 (patch) | |
| tree | 8a0576853b1fbfa572db3931705ae336743d5cf7 /src/test/java | |
| parent | 8daf1429c8b0e612d77f8582982d8f15835fbeb1 (diff) | |
Parse function signatures without return type
Diffstat (limited to 'src/test/java')
4 files changed, 32 insertions, 2 deletions
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 d799245b..8cd1c638 100644 --- a/src/test/java/org/shedlang/compiler/ast/untyped/UntypedFunctionSignatureNodeMatcher.java +++ b/src/test/java/org/shedlang/compiler/ast/untyped/UntypedFunctionSignatureNodeMatcher.java @@ -7,7 +7,7 @@ import org.zwobble.precisely.Matcher; import java.util.Optional; -import static org.zwobble.precisely.Matchers.has; +import static org.zwobble.precisely.Matchers.*; public class UntypedFunctionSignatureNodeMatcher extends MatcherBuilder< UntypedFunctionSignatureNode, @@ -44,7 +44,19 @@ public class UntypedFunctionSignatureNodeMatcher extends MatcherBuilder< return with(has("params", x -> x.params(), params)); } - public UntypedFunctionSignatureNodeMatcher withReturnType(Matcher<UntypedTypeLevelExpressionNode> returnType) { + public UntypedFunctionSignatureNodeMatcher withReturnType( + Matcher<UntypedTypeLevelExpressionNode> returnType + ) { + return withReturnTypeOptional(isOptionalOf(returnType)); + } + + public UntypedFunctionSignatureNodeMatcher withoutReturnType() { + return withReturnTypeOptional(isOptionalEmpty()); + } + + private UntypedFunctionSignatureNodeMatcher withReturnTypeOptional( + Matcher<Optional<? extends UntypedTypeLevelExpressionNode>> returnType + ) { return with(has("returnType", x -> x.returnType(), returnType)); } } diff --git a/src/test/java/org/shedlang/compiler/parser/ParserFunctionSignatureTests.java b/src/test/java/org/shedlang/compiler/parser/ParserFunctionSignatureTests.java index cfb610af..797d112d 100644 --- a/src/test/java/org/shedlang/compiler/parser/ParserFunctionSignatureTests.java +++ b/src/test/java/org/shedlang/compiler/parser/ParserFunctionSignatureTests.java @@ -180,4 +180,17 @@ public class ParserFunctionSignatureTests { .withReturnType(isUntypedTypeLevelReferenceNode("Unit")) ); } + + @Test + public void canParseSignatureWithoutReturnType() { + var source = "()"; + + var node = parseString(source, Parser::parseFunctionSignature); + + assertThat( + node, + isUntypedFunctionSignatureNode() + .withoutReturnType() + ); + } } diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerValTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerValTests.java index d8c98535..3f2adf5d 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerValTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerValTests.java @@ -48,6 +48,7 @@ public class TypeCheckerValTests { @Test public void valCanBeReferencedAfterDefinitionInFunction() { var untyped = UntypedFunctionDefinitionNode.builder() + .withReturnTypeUnit() .addStatement(Untyped.assign(Untyped.targetVal("x"), Untyped.stringLiteral("hello"))) .addStatement(Untyped.expressionStatement(Untyped.reference("x"))) .build(); @@ -94,6 +95,7 @@ public class TypeCheckerValTests { @Test public void valCannotBeReferencedBeforeDefinition() { var untyped = UntypedFunctionDefinitionNode.builder() + .withReturnTypeUnit() .addStatement(Untyped.expressionStatement(Untyped.reference("x"))) .addStatement(Untyped.assign(Untyped.targetVal("x"), Untyped.stringLiteral("hello"))) .build(); @@ -113,6 +115,7 @@ public class TypeCheckerValTests { @Test public void whenValShadowsExistingVariableThenValCannotBeReferencedBeforeDefinition() { var untyped = UntypedFunctionDefinitionNode.builder() + .withReturnTypeUnit() .addStatement(Untyped.expressionStatement(Untyped.reference("x"))) .addStatement(Untyped.assign(Untyped.targetVal("x"), Untyped.stringLiteral("hello"))) .build(); @@ -133,6 +136,7 @@ public class TypeCheckerValTests { @Test public void duplicateVariableNamesAreNotAllowed() { var untyped = UntypedFunctionDefinitionNode.builder() + .withReturnTypeUnit() .addStatement(Untyped.assign(Untyped.targetVal("x"), Untyped.stringLiteral("hello"))) .addStatement(Untyped.assign(Untyped.targetVal("x"), Untyped.stringLiteral("hello"))) .build(); diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerVarTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerVarTests.java index 5efdd2c5..0443802f 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerVarTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerVarTests.java @@ -33,6 +33,7 @@ public class TypeCheckerVarTests { @Test public void varCanBeReferencedAfterDefinitionInFunction() { var untyped = UntypedFunctionDefinitionNode.builder() + .withReturnTypeUnit() .addStatement(Untyped.assign(Untyped.targetVar("x"), Untyped.stringLiteral("hello"))) .addStatement(Untyped.expressionStatement(Untyped.reference("x"))) .build(); |
