aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-31 10:05:30 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-31 10:05:30 +0000
commit4316c4a80e33ceea40990472f215440a6f678623 (patch)
tree73608449b6f240b6fa9d66620838c362d47250c5 /src/test/java
parente6a7ea7a3eaecd2399d02c7264b89295752a63b7 (diff)
Add basic inference of type level args
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java
index 8fb1faf5..1dcfc36a 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerCallTests.java
@@ -423,4 +423,46 @@ public class TypeCheckerCallTests {
.withType(Types.constructedType(typeConstructor, List.of(Types.STRING)))
);
}
+
+ @Test
+ public void canCallGenericStructWithImplicitTypeArgs() {
+ var untyped = UntypedCallNode.builder()
+ .withReceiver(Untyped.reference("Box"))
+ .addNamedArg(Untyped.namedArg("value", Untyped.stringLiteral("Bob")))
+ .build();
+ var structType = Types.struct(NamespaceName.of("Example"), "Box");
+ var typeConstructor = Types.typeConstructor(
+ List.of(TypeParam.forStructType(structType, "T")),
+ structType
+ );
+ var structTypeInfo = StructTypeInfo.builder()
+ .addField("value", TypeParam.forStructType(structType, "T"))
+ .build();
+ var context = TypeCheckerContext.EMPTY
+ .enterGlobal(P.map(
+ Map.entry("String", Types.metaType(Types.STRING)),
+ Map.entry("Box", Types.typeConstructorType(typeConstructor))
+ ))
+ .addStructTypeInfo(structType, structTypeInfo);
+
+ var typed = typeCheckExpression(untyped, context);
+
+ assertThat(
+ typed.value(),
+ isTypedCallNode()
+ .withReceiver(isTypedReferenceNode(
+ "Box",
+ Types.typeConstructorType(typeConstructor)
+ ))
+ .withArgs(
+ isTypedArgsNode()
+ .withPositional(isSequence())
+ .withNamed(isSequence(
+ isTypedNamedArgNode("value", isTypedStringLiteralNode("Bob"))
+ ))
+ )
+ .withHasEffects(false)
+ .withType(Types.constructedType(typeConstructor, List.of(Types.STRING)))
+ );
+ }
}