From c7fe0a9bce177847468cef25b38a3eb1ad9cf9e0 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 18 Jul 2023 13:37:08 +0100 Subject: Support any order of function definitions in type checker --- .../TypeCheckerFunctionDefinitionTests.java | 2 +- .../typechecker/TypeCheckerNamespaceTests.java | 32 ++++++++++++++++++++++ .../compiler/typechecker/TypeCheckerValTests.java | 2 +- 3 files changed, 34 insertions(+), 2 deletions(-) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java index 794dd2c3..86b38d5c 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java @@ -356,6 +356,6 @@ public class TypeCheckerFunctionDefinitionTests { context = context.enterNamespace(environment.build()); - return TypeChecker.typeCheckNamespaceStatement(untyped, context); + return TypeChecker.typeCheckNamespaceStatement(untyped).typeCheckAllPhases(context); } } diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java index e4063606..03db0b54 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java @@ -86,6 +86,38 @@ public class TypeCheckerNamespaceTests { ); } + @Test + public void functionCanCallFunctionDefinedLater() { + var untyped = Untyped.namespace(List.of( + UntypedFunctionDefinitionNode.builder() + .withName("f") + .withReturnType(Untyped.typeLevelReference("Unit")) + .addStatement(Untyped.expressionStatement(Untyped.call( + Untyped.reference("g"), + List.of() + ))) + .build(), + UntypedFunctionDefinitionNode.builder() + .withName("g") + .withReturnType(Untyped.typeLevelReference("Unit")) + .build() + )); + var context = TypeCheckerContext.EMPTY + .enterNamespaceWithDefinedVariables(P.map(Map.entry("Unit", Types.metaType(Types.UNIT)))); + + var result = TypeChecker.typeCheckNamespace(untyped, context); + + assertThat( + result.value(), + isTypedNamespaceNode() + .withBody(isSequence( + isTypedFunctionDefinitionNode().withName("f"), + isTypedFunctionDefinitionNode().withName("g") + ) + ) + ); + } + @Test public void typesOfFieldsAreStored() { var namespaceName = NamespaceName.of("Example"); diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerValTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerValTests.java index 44abec8b..6c23f08b 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerValTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerValTests.java @@ -164,6 +164,6 @@ public class TypeCheckerValTests { context = context.enterNamespace(environment.build()); - return TypeChecker.typeCheckNamespaceStatement(untyped, context); + return TypeChecker.typeCheckNamespaceStatement(untyped).typeCheckAllPhases(context); } } -- cgit v1.2.3