aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-10 19:41:09 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-10 19:41:09 +0100
commit4089116972049123f447d72d1bd5cb5d7389c25e (patch)
treeecfcc11caa0516a606ed2064982efcc6800b46be /src/test/java
parente6d39d97d6415ebdaf990d44198ce29472f9cd1e (diff)
Add params to environment in function
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java
index 7ce8c7db..3eb177cc 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java
@@ -105,6 +105,54 @@ public class TypeCheckerFunctionDefinitionTests {
}
@Test
+ public void canReferencePositionalArgInBody() {
+ var untyped = UntypedFunctionDefinitionNode.builder()
+ .addPositionalParam("x", Untyped.typeLevelReference("String"))
+ .withReturnType(Untyped.typeLevelReference("Unit"))
+ .addStatement(Untyped.expressionStatement(Untyped.reference("x")))
+ .build();
+ var context = TypeCheckerContext.EMPTY
+ .enter(P.map(
+ Map.entry("String", Types.metaType(Types.STRING)),
+ Map.entry("Unit", Types.metaType(Types.UNIT))
+ ));
+
+ var typed = TypeChecker.typeCheckNamespaceStatement(untyped, context);
+
+ assertThat(
+ typed,
+ isTypedFunctionDefinitionNode()
+ .withBody(isSequence(
+ isTypedExpressionStatementNode(isTypedReferenceNode("x", Types.STRING))
+ ))
+ );
+ }
+
+ @Test
+ public void canReferenceNamedArgInBody() {
+ var untyped = UntypedFunctionDefinitionNode.builder()
+ .addNamedParam("x", Untyped.typeLevelReference("String"))
+ .withReturnType(Untyped.typeLevelReference("Unit"))
+ .addStatement(Untyped.expressionStatement(Untyped.reference("x")))
+ .build();
+ var context = TypeCheckerContext.EMPTY
+ .enter(P.map(
+ Map.entry("String", Types.metaType(Types.STRING)),
+ Map.entry("Unit", Types.metaType(Types.UNIT))
+ ));
+
+ var typed = TypeChecker.typeCheckNamespaceStatement(untyped, context);
+
+ assertThat(
+ typed,
+ isTypedFunctionDefinitionNode()
+ .withBody(isSequence(
+ isTypedExpressionStatementNode(isTypedReferenceNode("x", Types.STRING))
+ ))
+ );
+ }
+
+ @Test
public void freeVariablesIncludeVariablesReferencedInFunctionButDefinedOutsideOfFunction() {
var untyped = UntypedFunctionDefinitionNode.builder()
.withReturnType(Untyped.typeLevelReference("Unit"))
@@ -125,4 +173,26 @@ public class TypeCheckerFunctionDefinitionTests {
.withFreeVariables(containsExactly(equalTo("y")))
);
}
+
+ @Test
+ public void freeVariablesDoNotIncludeArgsReferencedInFunction() {
+ var untyped = UntypedFunctionDefinitionNode.builder()
+ .addPositionalParam("x", Untyped.typeLevelReference("String"))
+ .withReturnType(Untyped.typeLevelReference("Unit"))
+ .addStatement(Untyped.expressionStatement(Untyped.reference("x")))
+ .build();
+ var context = TypeCheckerContext.EMPTY
+ .enter(P.map(
+ Map.entry("String", Types.metaType(Types.STRING)),
+ Map.entry("Unit", Types.metaType(Types.UNIT))
+ ));
+
+ var typed = TypeChecker.typeCheckNamespaceStatement(untyped, context);
+
+ assertThat(
+ typed,
+ isTypedFunctionDefinitionNode()
+ .withFreeVariables(containsExactly())
+ );
+ }
}