From dd30830b4c24e046d1e35968bbe101748894f897 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 28 Sep 2023 12:35:20 +0100 Subject: Support calling struct types --- .../compiler/typechecker/TypeCheckerCallTests.java | 36 ++++++++++++++++++++-- 1 file changed, 33 insertions(+), 3 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 bb3e3cb6..28d8d2e0 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java @@ -5,9 +5,7 @@ import org.shedlang.compiler.ast.untyped.Untyped; import org.shedlang.compiler.ast.untyped.UntypedCallNode; import org.shedlang.compiler.typechecker.errors.*; import org.shedlang.compiler.typechecker.typesets.TypeSets; -import org.shedlang.compiler.types.Effects; -import org.shedlang.compiler.types.FunctionType; -import org.shedlang.compiler.types.Types; +import org.shedlang.compiler.types.*; import org.shedlang.compiler.util.P; import java.util.List; @@ -347,4 +345,36 @@ public class TypeCheckerCallTests { assertThat(error.allowed(), equalTo(Effects.NONE)); assertThat(error.actual(), equalTo(Effects.IO)); } + + @Test + public void canCallStruct() { + var untyped = UntypedCallNode.builder() + .withReceiver(Untyped.reference("User")) + .addNamedArg(Untyped.namedArg("name", Untyped.stringLiteral("Bob"))) + .build(); + var structType = Types.struct(NamespaceName.of("Example"), "User"); + var structTypeInfo = new StructTypeInfo(P.orderedPMap( + Map.entry("name", Types.STRING) + )); + var context = TypeCheckerContext.EMPTY + .enterGlobal(P.map(Map.entry("User", Types.metaType(structType)))) + .addStructTypeInfo(structType, structTypeInfo); + + var typed = TypeChecker.typeCheckExpression(untyped, context); + + assertThat( + typed.value(), + isTypedCallNode() + .withReceiver(isTypedReferenceNode("User", Types.metaType(structType))) + .withArgs( + isTypedArgsNode() + .withPositional(isSequence()) + .withNamed(isSequence( + isTypedNamedArgNode("name", isTypedStringLiteralNode("Bob")) + )) + ) + .withHasEffects(false) + .withType(structType) + ); + } } -- cgit v1.2.3