diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-09-28 10:56:25 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-09-28 10:56:34 +0100 |
| commit | 8d3e6ce5e6c77ff27e99f0f8ca0b22ff943b7d3f (patch) | |
| tree | 28695f6a710cb528df63fb7a90504328ff37c5d0 /src/test/java | |
| parent | 48f686951979f8fa8bd3b424a5139dd9150efec6 (diff) | |
Check structs can have mutually recursive fields
Diffstat (limited to 'src/test/java')
3 files changed, 45 insertions, 1 deletions
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 e5b13e6c..259c3215 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java @@ -281,6 +281,12 @@ public class TypedNodeMatchers { ); } + public static Matcher<TypedTypeLevelExpressionNode<?>> isTypedTypeLevelExpressionNode( + TypeLevelValue value + ) { + return has("value", x -> x.value(), equalTo(value)); + } + public static Matcher<TypedTypeLevelExpressionNode<?>> isTypedTypeLevelReferenceNode( String name, Matcher<TypeLevelValue> value diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java index d8fdc3ee..5a081076 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java @@ -362,6 +362,45 @@ public class TypeCheckerNamespaceTests { } @Test + public void structsCanHaveMutuallyRecursiveFields() { + var namespaceName = NamespaceName.of("Example", "Project"); + var untyped = Untyped.namespace(namespaceName, List.of( + UntypedStructDefinitionNode.builder() + .withName("A") + .addField(Untyped.structFieldDefinition("b", Untyped.typeLevelReference("B"))) + .build(), + UntypedStructDefinitionNode.builder() + .withName("B") + .addField(Untyped.structFieldDefinition("a", Untyped.typeLevelReference("A"))) + .build() + )); + var context = TypeCheckerContext.EMPTY; + + var result = TypeChecker.typeCheckNamespace(untyped, context); + + assertThat( + result.value(), + isTypedNamespaceNode() + .withBody(isSequence( + isTypedStructDefinitionNode() + .withName("A") + .withFields(isSequence( + isTypedStructFieldDefinitionNode() + .withName("b") + .withType(isTypedTypeLevelExpressionNode(Types.struct(namespaceName, "B"))) + )), + isTypedStructDefinitionNode() + .withName("B") + .withFields(isSequence( + isTypedStructFieldDefinitionNode() + .withName("a") + .withType(isTypedTypeLevelExpressionNode(Types.struct(namespaceName, "A"))) + )) + )) + ); + } + + @Test public void typesOfFieldsAreStored() { var namespaceName = NamespaceName.of("Example"); var untyped = Untyped.namespace( diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStructDefinitionTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStructDefinitionTests.java index dc23fa1c..f8cb0fc5 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStructDefinitionTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStructDefinitionTests.java @@ -6,7 +6,6 @@ import org.shedlang.compiler.ast.untyped.Untyped; import org.shedlang.compiler.ast.untyped.UntypedNamespaceStatementNode; import org.shedlang.compiler.ast.untyped.UntypedStructDefinitionNode; import org.shedlang.compiler.types.NamespaceName; -import org.shedlang.compiler.types.StructType; import org.shedlang.compiler.types.Types; import org.shedlang.compiler.util.P; |
