aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2025-01-26 10:23:13 +0000
committerMichael Williamson <mike@zwobble.org>2025-01-26 10:25:29 +0000
commitfb439df085eb1f7095d987973475a7753d0a1103 (patch)
tree361de3c13c39c292a6f5ea4ff778302efef5eac5 /src/test/java
parent7d76b7679d0b70b0e38ff08aeeeb78acde14aac3 (diff)
Use correct type for this in methods for generic structs
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStructDefinitionTests.java43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStructDefinitionTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStructDefinitionTests.java
index 09df039c..c1954ea5 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStructDefinitionTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerStructDefinitionTests.java
@@ -397,4 +397,47 @@ public class TypeCheckerStructDefinitionTests {
))
);
}
+
+ @Test
+ public void canTypeCheckMethodOnGenericStructReturningThis() {
+ var untyped = UntypedStructDefinitionNode.builder()
+ .withName("ExampleStruct")
+ .withTypeLevelParams(List.of(Untyped.typeParam("T")))
+ .addMethod(
+ UntypedFunctionDefinitionNode.builder()
+ .addPositionalParam("this", Optional.empty())
+ .withName("a")
+ .withReturnType(Untyped.constructedType(
+ Untyped.typeLevelReference("ExampleStruct"),
+ List.of(Untyped.typeLevelReference("T"))
+ ))
+ .addStatement(Untyped.functionReturn(Untyped.reference("this")))
+ .build()
+ )
+ .build();
+ var context = TypeCheckerContext.EMPTY;
+
+ var typed = typeCheckNamespaceStatement(untyped, context);
+
+ var structTypeInfo = typed.context().toTypeInfos()
+ .structTypeInfo(Types.struct(NAMESPACE_NAME, "ExampleStruct"))
+ .orElseThrow();
+ assertThat(
+ structTypeInfo,
+ has("methods", x -> x.methods(), isSequence(
+ equalTo(new MethodInfo(
+ "a",
+ FunctionType.builder()
+ .withReturnType(Types.constructedType(
+ Types.typeConstructor(
+ List.of(TypeParam.forStructType(Types.struct(NAMESPACE_NAME, "ExampleStruct"), "T")),
+ Types.struct(NAMESPACE_NAME, "ExampleStruct")
+ ),
+ List.of(TypeParam.forStructType(Types.struct(NAMESPACE_NAME, "ExampleStruct"), "T"))
+ ))
+ .build()
+ ))
+ ))
+ );
+ }
}