diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-10 19:41:09 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-10 19:41:09 +0100 |
| commit | 4089116972049123f447d72d1bd5cb5d7389c25e (patch) | |
| tree | ecfcc11caa0516a606ed2064982efcc6800b46be /src/test/java | |
| parent | e6d39d97d6415ebdaf990d44198ce29472f9cd1e (diff) | |
Add params to environment in function
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java | 70 |
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()) + ); + } } |
