diff options
| author | Michael Williamson <mike@zwobble.org> | 2025-01-26 10:23:13 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2025-01-26 10:25:29 +0000 |
| commit | fb439df085eb1f7095d987973475a7753d0a1103 (patch) | |
| tree | 361de3c13c39c292a6f5ea4ff778302efef5eac5 /src/test/java | |
| parent | 7d76b7679d0b70b0e38ff08aeeeb78acde14aac3 (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.java | 43 |
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() + )) + )) + ); + } } |
