aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-29 18:26:34 +0000
committerMichael Williamson <mike@zwobble.org>2023-10-29 18:26:34 +0000
commit90190801d932748535a0ab85039d9f45a6db5929 (patch)
treea8011a98b6a9381c25251a12a2b7b8e67dbe4e7b /src/test/java
parent5ab307fa798626d7f852ebec65f87e2af7487c53 (diff)
Check use of block returns when inferring return types
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"))