From 4981c362227679caabbe7178b1e54f6aaa6c84c0 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 29 Oct 2023 16:30:22 +0000 Subject: Parse function signatures without return type --- .../ast/untyped/UntypedFunctionSignatureNodeMatcher.java | 16 ++++++++++++++-- .../compiler/parser/ParserFunctionSignatureTests.java | 13 +++++++++++++ .../compiler/typechecker/TypeCheckerValTests.java | 4 ++++ .../compiler/typechecker/TypeCheckerVarTests.java | 1 + 4 files changed, 32 insertions(+), 2 deletions(-) (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 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 returnType) { + public UntypedFunctionSignatureNodeMatcher withReturnType( + Matcher returnType + ) { + return withReturnTypeOptional(isOptionalOf(returnType)); + } + + public UntypedFunctionSignatureNodeMatcher withoutReturnType() { + return withReturnTypeOptional(isOptionalEmpty()); + } + + private UntypedFunctionSignatureNodeMatcher withReturnTypeOptional( + Matcher> 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(); -- cgit v1.2.3