Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
changeKind: fix
packages:
- "@azure-tools/typespec-client-generator-core"
---

Consider inheritance when mapping first segment for paging result.
16 changes: 10 additions & 6 deletions packages/typespec-client-generator-core/src/methods.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<ListTestResult>;

model ListMeta{
@nextLink
nextLink: url;
}

model ListTestResult extends ListMeta {
@pageItems
tests: Test[];

@header
h: string;
}
model Test {
id: string;
}
model TestResponse<ResponseBody> {
...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);
});
Loading