aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionBodyTests.java52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionBodyTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionBodyTests.java
index 8b7bc4f6..dbd860e7 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionBodyTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionBodyTests.java
@@ -321,6 +321,58 @@ public class TypeCheckerFunctionBodyTests {
}
@Test
+ public void givenNoExplicitReturnTypeWhenThereIsBlockReturnWithNoReturnStatementsThenReturnTypeIsTypeOfBlock() {
+ var untyped = Untyped.block(List.of(
+ Untyped.blockReturn(Untyped.stringLiteral(""))
+ ));
+ var signature = TypedFunctionSignatureNode.builder()
+ .withoutReturnType()
+ .build();
+ var context = TypeCheckerContext.EMPTY;
+
+ var typed = typeCheckFunctionBody(untyped, signature, context);
+
+ assertThat(
+ typed.value(),
+ isTypedFunctionBodyNode()
+ .withType(Types.STRING)
+ );
+ }
+
+ @Test
+ public void givenNoExplicitReturnTypeWhenThereIsBlockReturnAndReturnStatementsThenReturnTypeIsCommonSupertypeOfReturnExpressions() {
+ var untyped = Untyped.block(List.of(
+ Untyped.expressionStatement(Untyped.if_(
+ List.of(
+ Untyped.conditionalBranch(
+ Untyped.reference("c"),
+ Untyped.block(List.of(
+ Untyped.functionReturn(Untyped.stringLiteral(""))
+ ))
+ )
+ ),
+ Untyped.block(List.of())
+ )),
+ Untyped.blockReturn(Untyped.intLiteral(0))
+ ));
+ var signature = TypedFunctionSignatureNode.builder()
+ .withoutReturnType()
+ .build();
+ var context = TypeCheckerContext.EMPTY
+ .enterGlobal(P.map(
+ Map.entry("c", Types.BOOL)
+ ));
+
+ var typed = typeCheckFunctionBody(untyped, signature, context);
+
+ assertThat(
+ typed.value(),
+ isTypedFunctionBodyNode()
+ .withType(Types.TOP)
+ );
+ }
+
+ @Test
public void freeVariablesIncludeVariablesReferencedInFunctionButDefinedOutsideOfFunction() {
var untyped = Untyped.block(List.of(
Untyped.expressionStatement(Untyped.reference("y"))