From e6d39d97d6415ebdaf990d44198ce29472f9cd1e Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 10 Jun 2023 19:26:53 +0100 Subject: Store free variables used in function --- .../compiler/ast/typed/TypedArgsNodeMatcher.java | 2 +- .../typed/TypedFunctionDefinitionNodeMatcher.java | 6 +++++- .../compiler/ast/typed/TypedNodeMatchers.java | 6 +++--- .../UntypedFunctionDefinitionNodeMatcher.java | 2 +- .../compiler/ast/untyped/UntypedNodeMatchers.java | 4 ++-- .../typechecker/TypeCheckerBoolLiteralTests.java | 4 ++-- .../compiler/typechecker/TypeCheckerCallTests.java | 6 +++--- .../TypeCheckerExpressionStatementTests.java | 2 +- .../TypeCheckerFunctionDefinitionTests.java | 22 ++++++++++++++++++++++ .../typechecker/TypeCheckerIntLiteralTests.java | 4 ++-- .../typechecker/TypeCheckerReferenceTests.java | 2 +- .../typechecker/TypeCheckerStringLiteralTests.java | 4 ++-- 12 files changed, 45 insertions(+), 19 deletions(-) (limited to 'src/test/java') 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> positional) { + public TypedArgsNodeMatcher withPositional(Matcher> 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> body) { + public TypedFunctionDefinitionNodeMatcher withBody(Matcher> body) { return with(has("body", x -> x.body(), body)); } @@ -37,6 +37,10 @@ public class TypedFunctionDefinitionNodeMatcher extends MatcherBuilder x.effect(), effect)); } + public TypedFunctionDefinitionNodeMatcher withFreeVariables(Matcher> 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 isTypedNamespaceNode( - Matcher> body + Matcher> body ) { return has("body", x -> x.body(), body); } @@ -78,8 +78,8 @@ public class TypedNodeMatchers { } public static Matcher isTypedParamsNode( - Matcher> positional, - Matcher> named + Matcher> positional, + Matcher> 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> body) { + public UntypedFunctionDefinitionNodeMatcher withBody(Matcher> 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 isUntypedParamsNode( - Matcher> positional, - Matcher> named + Matcher> positional, + Matcher> 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)); } } -- cgit v1.2.3