aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-12-10 23:40:54 +0000
committerMichael Williamson <mike@zwobble.org>2024-12-10 23:40:54 +0000
commiteed6af3b589f6c6eee94585447028e492653d499 (patch)
tree1900c627ddd801014b0c10cda1269673120d613a /src/test/java
parent4c0a26032280424c48ba364ea1f738b164cb064c (diff)
Preserve positionality of struct fields when typing struct
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/ast/typed/Typed.java2
-rw-r--r--src/test/java/org/shedlang/compiler/ast/typed/TypedStructFieldDefinitionNodeMatcher.java6
-rw-r--r--src/test/java/org/shedlang/compiler/ast/untyped/Untyped.java7
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStructDefinitionTests.java36
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)
))
);
}