diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-10 19:26:53 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-10 19:26:53 +0100 |
| commit | e6d39d97d6415ebdaf990d44198ce29472f9cd1e (patch) | |
| tree | 253aa06196abcc62e19967e170d0d9c844682b04 /src/test/java | |
| parent | 062175737e6f7f3971075a7446aeae76946b5c9e (diff) | |
Store free variables used in function
Diffstat (limited to 'src/test/java')
12 files changed, 45 insertions, 19 deletions
diff --git a/src/test/java/org/shedlang/compiler/ast/typed/TypedArgsNodeMatcher.java b/src/test/java/org/shedlang/compiler/ast/typed/TypedArgsNodeMatcher.java index 05037526..0d70a40d 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/TypedArgsNodeMatcher.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedArgsNodeMatcher.java @@ -26,7 +26,7 @@ public class TypedArgsNodeMatcher extends MatcherBuilder<TypedArgsNode, TypedArg return new TypedArgsNodeMatcher(submatchers); } - public TypedArgsNodeMatcher withPositional(Matcher<? super Iterable<TypedExpressionNode>> positional) { + public TypedArgsNodeMatcher withPositional(Matcher<? super Iterable<? extends TypedExpressionNode>> positional) { return with(has("positional", x -> x.positional(), positional)); } diff --git a/src/test/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNodeMatcher.java b/src/test/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNodeMatcher.java index 04a06f64..b1c6e59a 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNodeMatcher.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedFunctionDefinitionNodeMatcher.java @@ -29,7 +29,7 @@ public class TypedFunctionDefinitionNodeMatcher extends MatcherBuilder<TypedName return new TypedFunctionDefinitionNodeMatcher(submatchers); } - public TypedFunctionDefinitionNodeMatcher withBody(Matcher<Iterable<TypedFunctionStatementNode>> body) { + public TypedFunctionDefinitionNodeMatcher withBody(Matcher<Iterable<? extends TypedFunctionStatementNode>> body) { return with(has("body", x -> x.body(), body)); } @@ -37,6 +37,10 @@ public class TypedFunctionDefinitionNodeMatcher extends MatcherBuilder<TypedName return with(has("effect", x -> x.effect(), effect)); } + public TypedFunctionDefinitionNodeMatcher withFreeVariables(Matcher<Iterable<String>> freeVariables) { + return with(has("freeVariables", x -> x.freeVariables(), freeVariables)); + } + public TypedFunctionDefinitionNodeMatcher withName(String name) { return with(has("name", x -> x.name(), equalTo(name))); } diff --git a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java index ebf1ef42..dad777f6 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java @@ -62,7 +62,7 @@ public class TypedNodeMatchers { } public static Matcher<TypedNamespaceNode> isTypedNamespaceNode( - Matcher<Iterable<TypedNamespaceStatementNode>> body + Matcher<Iterable<? extends TypedNamespaceStatementNode>> body ) { return has("body", x -> x.body(), body); } @@ -78,8 +78,8 @@ public class TypedNodeMatchers { } public static Matcher<TypedParamsNode> isTypedParamsNode( - Matcher<Iterable<TypedParamNode>> positional, - Matcher<Iterable<TypedParamNode>> named + Matcher<Iterable<? extends TypedParamNode>> positional, + Matcher<Iterable<? extends TypedParamNode>> named ) { return allOf( has("positional", x -> x.positional(), positional), diff --git a/src/test/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNodeMatcher.java b/src/test/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNodeMatcher.java index c88111df..8dae4a31 100644 --- a/src/test/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNodeMatcher.java +++ b/src/test/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNodeMatcher.java @@ -29,7 +29,7 @@ public class UntypedFunctionDefinitionNodeMatcher extends MatcherBuilder<Untyped return new UntypedFunctionDefinitionNodeMatcher(submatchers); } - public UntypedFunctionDefinitionNodeMatcher withBody(Matcher<Iterable<UntypedFunctionStatementNode>> body) { + public UntypedFunctionDefinitionNodeMatcher withBody(Matcher<Iterable<? extends UntypedFunctionStatementNode>> body) { return with(has("body", x -> x.body(), body)); } diff --git a/src/test/java/org/shedlang/compiler/ast/untyped/UntypedNodeMatchers.java b/src/test/java/org/shedlang/compiler/ast/untyped/UntypedNodeMatchers.java index 6c06e52a..95d30cc6 100644 --- a/src/test/java/org/shedlang/compiler/ast/untyped/UntypedNodeMatchers.java +++ b/src/test/java/org/shedlang/compiler/ast/untyped/UntypedNodeMatchers.java @@ -40,8 +40,8 @@ public class UntypedNodeMatchers { } public static Matcher<UntypedParamsNode> isUntypedParamsNode( - Matcher<Iterable<UntypedParamNode>> positional, - Matcher<Iterable<UntypedParamNode>> named + Matcher<Iterable<? extends UntypedParamNode>> positional, + Matcher<Iterable<? extends UntypedParamNode>> named ) { return allOf( has("positional", x -> x.positional(), positional), diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBoolLiteralTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBoolLiteralTests.java index 44258695..c39718de 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBoolLiteralTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerBoolLiteralTests.java @@ -15,7 +15,7 @@ public class TypeCheckerBoolLiteralTests { var typed = TypeChecker.typeCheckExpression(untyped, TypeCheckerContext.EMPTY); - assertThat(typed, isTypedBoolLiteralNode(true)); - assertThat(typed.type(), equalTo(Types.BOOL)); + assertThat(typed.value(), isTypedBoolLiteralNode(true)); + assertThat(typed.value().type(), equalTo(Types.BOOL)); } } diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java index 19c08b14..24ded26f 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java @@ -33,7 +33,7 @@ public class TypeCheckerCallTests { var typed = TypeChecker.typeCheckExpression(untyped, context); assertThat( - typed, + typed.value(), isTypedCallNode() .withReceiver(isTypedReferenceNode("f", functionType)) .withArgs(isTypedArgsNode().withPositional(isSequence()).withNamed(isSequence())) @@ -79,7 +79,7 @@ public class TypeCheckerCallTests { var typed = TypeChecker.typeCheckExpression(untyped, context); assertThat( - typed, + typed.value(), isTypedCallNode() .withArgs(isTypedArgsNode().withPositional(isSequence( isTypedStringLiteralNode("hello"), @@ -108,7 +108,7 @@ public class TypeCheckerCallTests { var typed = TypeChecker.typeCheckExpression(untyped, context); assertThat( - typed, + typed.value(), isTypedCallNode() .withArgs(isTypedArgsNode().withNamed(isSequence( isTypedNamedArgNode("x", isTypedStringLiteralNode("hello")), diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerExpressionStatementTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerExpressionStatementTests.java index a475ed6c..b7ffca1b 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerExpressionStatementTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerExpressionStatementTests.java @@ -14,6 +14,6 @@ public class TypeCheckerExpressionStatementTests { var typed = TypeChecker.typeCheckFunctionStatement(untyped, TypeCheckerContext.EMPTY); - assertThat(typed, isTypedExpressionStatementNode(isTypedStringLiteralNode("hello"))); + assertThat(typed.value(), isTypedExpressionStatementNode(isTypedStringLiteralNode("hello"))); } } diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java index 1671bed4..7ce8c7db 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java @@ -103,4 +103,26 @@ public class TypeCheckerFunctionDefinitionTests { )) ); } + + @Test + public void freeVariablesIncludeVariablesReferencedInFunctionButDefinedOutsideOfFunction() { + var untyped = UntypedFunctionDefinitionNode.builder() + .withReturnType(Untyped.typeLevelReference("Unit")) + .addStatement(Untyped.expressionStatement(Untyped.reference("y"))) + .build(); + var context = TypeCheckerContext.EMPTY + .enter(P.map( + Map.entry("Unit", Types.metaType(Types.UNIT)), + Map.entry("x", Types.STRING), + Map.entry("y", Types.STRING) + )); + + var typed = TypeChecker.typeCheckNamespaceStatement(untyped, context); + + assertThat( + typed, + isTypedFunctionDefinitionNode() + .withFreeVariables(containsExactly(equalTo("y"))) + ); + } } diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIntLiteralTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIntLiteralTests.java index ca47b336..ce007495 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIntLiteralTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIntLiteralTests.java @@ -15,7 +15,7 @@ public class TypeCheckerIntLiteralTests { var typed = TypeChecker.typeCheckExpression(untyped, TypeCheckerContext.EMPTY); - assertThat(typed, isTypedIntLiteralNode(42)); - assertThat(typed.type(), equalTo(Types.INT)); + assertThat(typed.value(), isTypedIntLiteralNode(42)); + assertThat(typed.value().type(), equalTo(Types.INT)); } } diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerReferenceTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerReferenceTests.java index 659514f2..9d067cc1 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerReferenceTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerReferenceTests.java @@ -22,7 +22,7 @@ public class TypeCheckerReferenceTests { var typed = TypeChecker.typeCheckExpression(untyped, context); - assertThat(typed, isTypedReferenceNode("x", Types.STRING)); + assertThat(typed.value(), isTypedReferenceNode("x", Types.STRING)); } @Test diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStringLiteralTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStringLiteralTests.java index 352fbef9..7ede9a67 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStringLiteralTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStringLiteralTests.java @@ -15,7 +15,7 @@ public class TypeCheckerStringLiteralTests { var typed = TypeChecker.typeCheckExpression(untyped, TypeCheckerContext.EMPTY); - assertThat(typed, isTypedStringLiteralNode("hello")); - assertThat(typed.type(), equalTo(Types.STRING)); + assertThat(typed.value(), isTypedStringLiteralNode("hello")); + assertThat(typed.value().type(), equalTo(Types.STRING)); } } |
