From f5b0a2fc84fe231c02645c630013c71610c64554 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 13 Jun 2023 20:54:23 +0100 Subject: Store types of fields on namespace node --- .../org/shedlang/compiler/ast/untyped/Untyped.java | 9 +++++- .../typechecker/TypeCheckerNamespaceTests.java | 36 +++++++++++++++++++--- 2 files changed, 40 insertions(+), 5 deletions(-) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java b/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java index 1f2f5c95..f93b7d5a 100644 --- a/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java +++ b/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java @@ -50,8 +50,15 @@ public class Untyped { return new UntypedNamedArgNode(name, expression, Sources.NULL); } + public static UntypedNamespaceNode namespace( + NamespaceName namespaceName, + List body + ) { + return new UntypedNamespaceNode(namespaceName, body, Sources.NULL); + } + public static UntypedNamespaceNode namespace(List body) { - return new UntypedNamespaceNode(NamespaceName.of("Example"), body, Sources.NULL); + return namespace(NamespaceName.of("DefaultNamespaceName"), body); } public static UntypedReferenceNode reference(String name) { diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java index a0f69b89..734ed89a 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java @@ -3,6 +3,8 @@ package org.shedlang.compiler.typechecker; import org.junit.jupiter.api.Test; import org.shedlang.compiler.ast.untyped.Untyped; import org.shedlang.compiler.ast.untyped.UntypedFunctionDefinitionNode; +import org.shedlang.compiler.types.FunctionType; +import org.shedlang.compiler.types.NamespaceName; import org.shedlang.compiler.types.Types; import org.shedlang.compiler.util.P; @@ -12,6 +14,7 @@ import java.util.Map; import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.isTypedFunctionDefinitionNode; import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.isTypedNamespaceNode; import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.equalTo; import static org.zwobble.precisely.Matchers.isSequence; public class TypeCheckerNamespaceTests { @@ -21,10 +24,10 @@ public class TypeCheckerNamespaceTests { var context = TypeCheckerContext.EMPTY .enter(P.map(Map.entry("Unit", Types.metaType(Types.UNIT)))); - var typed = TypeChecker.typeCheckNamespace(untyped, context); + var result = TypeChecker.typeCheckNamespace(untyped, context); assertThat( - typed, + result.value(), isTypedNamespaceNode(isSequence()) ); } @@ -40,13 +43,38 @@ public class TypeCheckerNamespaceTests { var context = TypeCheckerContext.EMPTY .enter(P.map(Map.entry("Unit", Types.metaType(Types.UNIT)))); - var typed = TypeChecker.typeCheckNamespace(untyped, context); + var result = TypeChecker.typeCheckNamespace(untyped, context); assertThat( - typed, + result.value(), isTypedNamespaceNode(isSequence( isTypedFunctionDefinitionNode().withName("f") )) ); } + + @Test + public void typesOfFieldsAreStored() { + var namespaceName = NamespaceName.of("Example"); + var untyped = Untyped.namespace( + namespaceName, + List.of( + UntypedFunctionDefinitionNode.builder() + .withName("f") + .withReturnType(Untyped.typeLevelReference("Unit")) + .build() + ) + ); + var context = TypeCheckerContext.EMPTY + .enter(P.map(Map.entry("Unit", Types.metaType(Types.UNIT)))); + + var result = TypeChecker.typeCheckNamespace(untyped, context); + + assertThat( + result.context().namespaceFields().get(namespaceName), + equalTo(P.orderedMap( + Map.entry("f", new FunctionType(List.of(), List.of(), Types.UNIT)) + )) + ); + } } -- cgit v1.2.3