diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-09-28 12:35:20 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-09-28 12:37:36 +0100 |
| commit | dd30830b4c24e046d1e35968bbe101748894f897 (patch) | |
| tree | b8ad8d3dce6eebac2b4bd1ff094ac1c0830a8e49 /src/test/java | |
| parent | b964e7195924ce411471d680c0c4e521abbc690a (diff) | |
Support calling struct types
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java | 36 |
1 files changed, 33 insertions, 3 deletions
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) + ); + } } |
