From 12bc0b647eb6276a93c134e35c5babc4efc01d93 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 28 Sep 2023 15:36:08 +0100 Subject: Handle definition of struct when checking dependencies --- .../typechecker/TypeCheckerNamespaceTests.java | 34 ++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java index 7663a0aa..34179cb2 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java @@ -363,6 +363,40 @@ public class TypeCheckerNamespaceTests { ); } + @Test + public void valCanReferenceFunctionDefinedLaterThatUsesStructDefinedEvenLater() { + var untyped = Untyped.namespace(NamespaceName.of("Example", "Project"), List.of( + Untyped.val("none", Untyped.call( + Untyped.reference("createNone"), + List.of() + )), + UntypedFunctionDefinitionNode.builder() + .withName("createNone") + .withReturnType(Untyped.typeLevelReference("None")) + .addStatement(Untyped.functionReturn(Untyped.call( + Untyped.reference("None"), + List.of() + ))) + .build(), + UntypedStructDefinitionNode.builder() + .withName("None") + .build() + )); + var context = TypeCheckerContext.EMPTY; + + var result = TypeChecker.typeCheckNamespace(untyped, context); + + assertThat( + result.value(), + isTypedNamespaceNode() + .withBody(isSequence( + isTypedValNode("none", anything()), + isTypedFunctionDefinitionNode(), + isTypedStructDefinitionNode() + )) + ); + } + @Test public void functionBodyCanAccessFieldOnTypeDefinedLater() { var untyped = Untyped.namespace(NamespaceName.of("Example", "Project"), List.of( -- cgit v1.2.3