diff --git a/.chronus/changes/tcgc-fix_paging_metadata-2025-7-14-17-14-29.md b/.chronus/changes/tcgc-fix_paging_metadata-2025-7-14-17-14-29.md new file mode 100644 index 0000000000..19f987c787 --- /dev/null +++ b/.chronus/changes/tcgc-fix_paging_metadata-2025-7-14-17-14-29.md @@ -0,0 +1,7 @@ +--- +changeKind: fix +packages: + - "@azure-tools/typespec-client-generator-core" +--- + +Consider inheritance when mapping first segment for paging result. \ No newline at end of file diff --git a/packages/typespec-client-generator-core/src/methods.ts b/packages/typespec-client-generator-core/src/methods.ts index 32c13ddd12..c9c6913a18 100644 --- a/packages/typespec-client-generator-core/src/methods.ts +++ b/packages/typespec-client-generator-core/src/methods.ts @@ -354,13 +354,17 @@ function mapFirstSegmentForResultSegments( if (resultSegments.length > 0 && responseModel) { for (let i = 0; i < resultSegments.length; i++) { const segment = resultSegments[i]; - for (const property of responseModel.properties ?? []) { - if ( - property.__raw && - findRootSourceProperty(property.__raw) === findRootSourceProperty(segment) - ) { - return [property.__raw, ...resultSegments.slice(i + 1)]; + let current: SdkModelType | undefined = responseModel; + while (current) { + for (const property of current.properties ?? []) { + if ( + property.__raw && + findRootSourceProperty(property.__raw) === findRootSourceProperty(segment) + ) { + return [property.__raw, ...resultSegments.slice(i + 1)]; + } } + current = current.baseModel; } } } diff --git a/packages/typespec-client-generator-core/test/methods/paged-operation.test.ts b/packages/typespec-client-generator-core/test/methods/paged-operation.test.ts index f0d7edc0f3..09676ef891 100644 --- a/packages/typespec-client-generator-core/test/methods/paged-operation.test.ts +++ b/packages/typespec-client-generator-core/test/methods/paged-operation.test.ts @@ -1101,3 +1101,47 @@ it("paged result with body root", async () => { strictEqual(response.resultSegments[0], sdkPackage.models[0].properties[0]); strictEqual(method.pagingMetadata.pageItemsSegments, response.resultSegments); }); + +it("next link with body root and inheritance", async () => { + await runner.compileWithBuiltInService(` + @list + op test(): TestResponse; + + model ListMeta{ + @nextLink + nextLink: url; + } + + model ListTestResult extends ListMeta { + @pageItems + tests: Test[]; + + @header + h: string; + } + model Test { + id: string; + } + model TestResponse { + ...OkResponse; + + @bodyRoot + body: ResponseBody; + } + `); + const sdkPackage = runner.context.sdkPackage; + const method = getServiceMethodOfClient(sdkPackage); + strictEqual(method.name, "test"); + strictEqual(method.kind, "paging"); + strictEqual(method.pagingMetadata.nextLinkSegments?.length, 1); + strictEqual( + method.pagingMetadata.nextLinkSegments[0], + sdkPackage.models[0].baseModel?.properties[0], + ); + + const response = method.response; + strictEqual(response.kind, "method"); + strictEqual(response.resultSegments?.length, 1); + strictEqual(response.resultSegments[0], sdkPackage.models[0].properties[0]); + strictEqual(method.pagingMetadata.pageItemsSegments, response.resultSegments); +});