From a1806b32dc21709d81e2378923910b100145cf90 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 30 Sep 2023 17:41:04 +0100 Subject: Construct typed node for sum type definitions --- .../compiler/ast/typed/TypedNodeMatchers.java | 10 +++++++++ .../TypeCheckerSumTypeDefinitionTests.java | 26 ++++++++++++++++++++++ 2 files changed, 36 insertions(+) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java index 7bd1402d..1f64f631 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java @@ -1,5 +1,6 @@ package org.shedlang.compiler.ast.typed; +import org.shedlang.compiler.types.SumType; import org.shedlang.compiler.types.TupleType; import org.shedlang.compiler.types.Type; import org.shedlang.compiler.types.TypeLevelValue; @@ -251,6 +252,15 @@ public class TypedNodeMatchers { return TypedStructFieldDefinitionNodeMatcher.empty(); } + public static Matcher isTypedSumTypeDefinitionNode( + SumType type + ) { + return instanceOf( + TypedSumTypeDefinitionNode.class, + has("type", x -> x.type(), equalTo(type)) + ); + } + public static Matcher isTypedTargetIgnore() { return instanceOf(TypedTargetNode.Ignore.class); } diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerSumTypeDefinitionTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerSumTypeDefinitionTests.java index 167a2477..0a551c95 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerSumTypeDefinitionTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerSumTypeDefinitionTests.java @@ -2,6 +2,7 @@ package org.shedlang.compiler.typechecker; import org.junit.jupiter.api.Test; import org.shedlang.compiler.ast.typed.TypedNamespaceStatementNode; +import org.shedlang.compiler.ast.untyped.Untyped; import org.shedlang.compiler.ast.untyped.UntypedNamespaceStatementNode; import org.shedlang.compiler.ast.untyped.UntypedSumTypeDefinitionNode; import org.shedlang.compiler.typechecker.errors.CannotDefineSumTypeOutsideOfNamespace; @@ -9,7 +10,10 @@ import org.shedlang.compiler.types.NamespaceName; import org.shedlang.compiler.types.Types; import org.shedlang.compiler.util.P; +import java.util.Map; + import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.isTypedSumTypeDefinitionNode; import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.equalTo; import static org.zwobble.precisely.Matchers.isOptionalOf; @@ -48,6 +52,28 @@ public class TypeCheckerSumTypeDefinitionTests { ); } + @Test + public void canTypeCheckSumTypeWithVariantsInSameNamespace() { + var untyped = UntypedSumTypeDefinitionNode.builder() + .withName("ExampleSumType") + .addVariant(Untyped.typeLevelReference("A")) + .addVariant(Untyped.typeLevelReference("A")) + .build(); + var variantType1 = Types.struct(NAMESPACE_NAME, "A"); + var variantType2 = Types.struct(NAMESPACE_NAME, "B"); + var context = TypeCheckerContext.EMPTY + .enterGlobal(P.map( + Map.entry("A", Types.metaType(variantType1)), + Map.entry("B", Types.metaType(variantType2)) + )); + + var typed = typeCheckNamespaceStatement(untyped, context); + + assertThat(typed.value(), isTypedSumTypeDefinitionNode( + Types.sum(NAMESPACE_NAME, "ExampleSumType") + )); + } + private static TypeCheckerResult typeCheckNamespaceStatement( UntypedNamespaceStatementNode untyped, TypeCheckerContext context -- cgit v1.2.3