aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-28 10:56:25 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-28 10:56:34 +0100
commit8d3e6ce5e6c77ff27e99f0f8ca0b22ff943b7d3f (patch)
tree28695f6a710cb528df63fb7a90504328ff37c5d0 /src/test/java
parent48f686951979f8fa8bd3b424a5139dd9150efec6 (diff)
Check structs can have mutually recursive fields
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java6
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java39
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStructDefinitionTests.java1
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;