aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-29 16:30:22 +0000
committerMichael Williamson <mike@zwobble.org>2023-10-29 16:30:22 +0000
commit4981c362227679caabbe7178b1e54f6aaa6c84c0 (patch)
tree8a0576853b1fbfa572db3931705ae336743d5cf7 /src/test/java
parent8daf1429c8b0e612d77f8582982d8f15835fbeb1 (diff)
Parse function signatures without return type
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/ast/untyped/UntypedFunctionSignatureNodeMatcher.java16
-rw-r--r--src/test/java/org/shedlang/compiler/parser/ParserFunctionSignatureTests.java13
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerValTests.java4
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerVarTests.java1
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();