aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-18 13:37:08 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-18 13:37:08 +0100
commitc7fe0a9bce177847468cef25b38a3eb1ad9cf9e0 (patch)
treeaf322bacfe26376157a9fb1a15ba9fe323a4e584 /src/test/java
parentdb477d8a01c7f4ee200826baaee0342f7f797604 (diff)
Support any order of function definitions in type checker
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java2
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java32
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerValTests.java2
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);
}
}