diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-18 13:37:08 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-18 13:37:08 +0100 |
| commit | c7fe0a9bce177847468cef25b38a3eb1ad9cf9e0 (patch) | |
| tree | af322bacfe26376157a9fb1a15ba9fe323a4e584 /src/test/java | |
| parent | db477d8a01c7f4ee200826baaee0342f7f797604 (diff) | |
Support any order of function definitions in type checker
Diffstat (limited to 'src/test/java')
3 files changed, 34 insertions, 2 deletions
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 @@ -87,6 +87,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"); var untyped = Untyped.namespace( 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); } } |
