diff options
| author | Michael Williamson <mike@zwobble.org> | 2024-12-10 23:40:54 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2024-12-10 23:40:54 +0000 |
| commit | eed6af3b589f6c6eee94585447028e492653d499 (patch) | |
| tree | 1900c627ddd801014b0c10cda1269673120d613a /src/test/java | |
| parent | 4c0a26032280424c48ba364ea1f738b164cb064c (diff) | |
Preserve positionality of struct fields when typing struct
Diffstat (limited to 'src/test/java')
4 files changed, 49 insertions, 2 deletions
diff --git a/src/test/java/org/shedlang/compiler/ast/typed/Typed.java b/src/test/java/org/shedlang/compiler/ast/typed/Typed.java index bfa2564b..0fe33eaa 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/Typed.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/Typed.java @@ -222,7 +222,7 @@ public class Typed { String name, TypedTypeLevelExpressionNode<Type> type ) { - return new TypedStructFieldDefinitionNode(name, type, Sources.NULL); + return new TypedStructFieldDefinitionNode(name, type, false, Sources.NULL); } public static TypedSumTypeDefinitionNode sumTypeDefinition(SimpleSumType sumType) { diff --git a/src/test/java/org/shedlang/compiler/ast/typed/TypedStructFieldDefinitionNodeMatcher.java b/src/test/java/org/shedlang/compiler/ast/typed/TypedStructFieldDefinitionNodeMatcher.java index f8ba23ae..7053bd26 100644 --- a/src/test/java/org/shedlang/compiler/ast/typed/TypedStructFieldDefinitionNodeMatcher.java +++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedStructFieldDefinitionNodeMatcher.java @@ -42,4 +42,10 @@ public class TypedStructFieldDefinitionNodeMatcher extends MatcherBuilder< ) { return with(has("type", x -> x.type(), type)); } + + public TypedStructFieldDefinitionNodeMatcher withIsPositional( + boolean isPositional + ) { + return with(has("isPositional", x -> x.isPositional(), equalTo(isPositional))); + } } 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 43e8154c..480e63a4 100644 --- a/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java +++ b/src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java @@ -192,6 +192,13 @@ public class Untyped { return new UntypedStructFieldDefinitionNode(name, type, false, Sources.NULL); } + public static UntypedStructFieldDefinitionNode structFieldDefinitionPositional( + String name, + UntypedTypeLevelExpressionNode type + ) { + return new UntypedStructFieldDefinitionNode(name, type, true, Sources.NULL); + } + public static UntypedBinaryOperationNode sub( UntypedExpressionNode left, UntypedExpressionNode right diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStructDefinitionTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStructDefinitionTests.java index a9003de8..9928208c 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStructDefinitionTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStructDefinitionTests.java @@ -162,10 +162,44 @@ public class TypeCheckerStructDefinitionTests { .withFields(isSequence( isTypedStructFieldDefinitionNode() .withName("b") - .withType(isTypedTypeLevelReferenceNode("Bool", Types.BOOL)), + .withType(isTypedTypeLevelReferenceNode("Bool", Types.BOOL)) + .withIsPositional(false), isTypedStructFieldDefinitionNode() .withName("a") .withType(isTypedTypeLevelReferenceNode("Int", Types.INT)) + .withIsPositional(false) + )) + ); + } + + @Test + public void canTypeCheckStructDefinitionWithPositionalFields() { + var untyped = UntypedStructDefinitionNode.builder() + .withName("ExampleStruct") + .addField(Untyped.structFieldDefinitionPositional("b", Untyped.typeLevelReference("Bool"))) + .addField(Untyped.structFieldDefinitionPositional("a", Untyped.typeLevelReference("Int"))) + .build(); + var context = TypeCheckerContext.EMPTY + .enterGlobal(P.map( + Map.entry("Bool", Types.metaType(Types.BOOL)), + Map.entry("Int", Types.metaType(Types.INT)) + )); + + var typed = typeCheckNamespaceStatement(untyped, context); + + assertThat( + typed.value(), + isTypedStructDefinitionNode() + .withType(isStructType(NAMESPACE_NAME, "ExampleStruct")) + .withFields(isSequence( + isTypedStructFieldDefinitionNode() + .withName("b") + .withType(isTypedTypeLevelReferenceNode("Bool", Types.BOOL)) + .withIsPositional(true), + isTypedStructFieldDefinitionNode() + .withName("a") + .withType(isTypedTypeLevelReferenceNode("Int", Types.INT)) + .withIsPositional(true) )) ); } |
