From 1b56846cfdf7e25408920bdeb4f46edb721a218f Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 11 Dec 2024 00:29:06 +0000 Subject: Type check calls to positional structs --- .../compiler/typechecker/TypeCheckerCallTests.java | 34 ++++++++++++++++++++++ .../compiler/typechecker/TypeCheckerWhenTests.java | 8 ++--- 2 files changed, 37 insertions(+), 5 deletions(-) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java index cfae87ed..bef0039c 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java @@ -356,6 +356,7 @@ public class TypeCheckerCallTests { var structType = Types.struct(NamespaceName.of("Example"), "User"); var structTypeInfo = StructTypeInfo.builder() .addField("name", Types.STRING) + .withFieldsArePositional(false) .build(); var context = TypeCheckerContext.EMPTY .enterGlobal(P.map(Map.entry("User", Types.metaType(structType)))) @@ -379,6 +380,39 @@ public class TypeCheckerCallTests { ); } + @Test + public void canCallStructWithPositionalFields() { + var untyped = UntypedCallNode.builder() + .withReceiver(Untyped.reference("User")) + .addPositionalArg(Untyped.stringLiteral("Bob")) + .build(); + var structType = Types.struct(NamespaceName.of("Example"), "User"); + var structTypeInfo = StructTypeInfo.builder() + .addField("name", Types.STRING) + .withFieldsArePositional(true) + .build(); + var context = TypeCheckerContext.EMPTY + .enterGlobal(P.map(Map.entry("User", Types.metaType(structType)))) + .addStructTypeInfo(structType, structTypeInfo); + + var typed = typeCheckExpression(untyped, context); + + assertThat( + typed.value(), + isTypedCallNode() + .withReceiver(isTypedReferenceNode("User", Types.metaType(structType))) + .withArgs( + isTypedArgsNode() + .withPositional(isSequence( + isTypedStringLiteralNode("Bob") + )) + .withNamed(isSequence()) + ) + .withHasEffects(false) + .withType(structType) + ); + } + @Test public void canCallGenericStructWithExplicitTypeArgs() { var untyped = UntypedCallNode.builder() diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java index e41bc2fa..c6fd0480 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java @@ -303,11 +303,9 @@ public class TypeCheckerWhenTests { ))) .addStructTypeInfo( VARIANT_TYPE_1, - new StructTypeInfo( - FieldsInfo.builder() - .addField("value", TypeParam.forStructType(VARIANT_TYPE_1, "T")) - .build() - ) + StructTypeInfo.builder() + .addField("value", TypeParam.forStructType(VARIANT_TYPE_1, "T")) + .build() ) .enterGlobal(P.map( Map.entry("x", SUM_TYPE), -- cgit v1.2.3