From e5a158a7439533c6b76d350662a6fc75b3066b71 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Mon, 29 Sep 2025 14:06:49 +0800 Subject: [PATCH 1/5] continuationToken can be used in azurev2 --- packages/http-client-java/emitter/src/code-model-builder.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-java/emitter/src/code-model-builder.ts b/packages/http-client-java/emitter/src/code-model-builder.ts index 6ed951dd8e4..1238353de96 100644 --- a/packages/http-client-java/emitter/src/code-model-builder.ts +++ b/packages/http-client-java/emitter/src/code-model-builder.ts @@ -1088,7 +1088,7 @@ export class CodeModelBuilder { let continuationTokenParameter: Parameter | undefined; let continuationTokenResponseProperty: Property[] | undefined; let continuationTokenResponseHeader: HttpHeader | undefined; - if (!this.isBranded()) { + if (!this.isAzureV1()) { // parameter would either be query or header parameter, so taking the last segment would be enough const continuationTokenParameterSegment = sdkMethod.pagingMetadata.continuationTokenParameterSegments?.at(-1); From b750a391bf1e2b5c01ee0dc6427e3c643be9cfd1 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Mon, 29 Sep 2025 14:57:57 +0800 Subject: [PATCH 2/5] warn but pass on nested pageItems in azure v1 --- .../emitter/src/code-model-builder.ts | 16 ++++++++++++++++ packages/http-client-java/emitter/src/lib.ts | 6 ++++++ 2 files changed, 22 insertions(+) diff --git a/packages/http-client-java/emitter/src/code-model-builder.ts b/packages/http-client-java/emitter/src/code-model-builder.ts index 1238353de96..d91981ae731 100644 --- a/packages/http-client-java/emitter/src/code-model-builder.ts +++ b/packages/http-client-java/emitter/src/code-model-builder.ts @@ -1072,6 +1072,22 @@ export class CodeModelBuilder { ? pageItemsResponseProperty[0].serializedName : undefined; + if ( + this.isAzureV1() && + (pageItemsResponseProperty === undefined || pageItemsResponseProperty.length > 1) + ) { + // TCGC should have verified that pageItems exists + + // Azure V1 does not support nested page items + reportDiagnostic(this.program, { + code: "nested-page-items-not-supported", + target: + sdkMethod.response.resultSegments?.[sdkMethod.response.resultSegments.length - 1] + ?.__raw ?? NoTarget, + }); + return; + } + // nextLink // TODO: nextLink can also be a response header, similar to "sdkMethod.pagingMetadata.continuationTokenResponseSegments" const nextLinkResponseProperty = findResponsePropertySegments( diff --git a/packages/http-client-java/emitter/src/lib.ts b/packages/http-client-java/emitter/src/lib.ts index 5f0caeeea5a..5816a1508be 100644 --- a/packages/http-client-java/emitter/src/lib.ts +++ b/packages/http-client-java/emitter/src/lib.ts @@ -107,6 +107,12 @@ export const $lib = createTypeSpecLibrary({ default: paramMessage`Namespace '${"namespace"}' contains reserved Java keywords, replaced it with '${"processedNamespace"}'.`, }, }, + "nested-page-items-not-supported": { + severity: "warning", + messages: { + default: "Nested pageItems is not supported in Azure V1.", + }, + }, }, emitter: { options: EmitterOptionsSchema, From f9422d972e9d49d7c8ea62836bd9b2465c999563 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Mon, 29 Sep 2025 15:05:23 +0800 Subject: [PATCH 3/5] bug fix --- .../http-client-java/emitter/src/code-model-builder.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/http-client-java/emitter/src/code-model-builder.ts b/packages/http-client-java/emitter/src/code-model-builder.ts index d91981ae731..fec24eda084 100644 --- a/packages/http-client-java/emitter/src/code-model-builder.ts +++ b/packages/http-client-java/emitter/src/code-model-builder.ts @@ -528,10 +528,11 @@ export class CodeModelBuilder { // skip models under "com.azure.core." in java, or "Azure." in typespec, if branded !( ( - this.isBranded() && - (schema.language.java?.namespace?.startsWith("com.azure.core.") || - schema.language.default?.namespace?.startsWith("Azure.") || - schema.language.java?.namespace?.startsWith("com.azure.v2.core.") || + (this.isBranded() && + (schema.language.java?.namespace?.startsWith("com.azure.core.") || + schema.language.default?.namespace?.startsWith("Azure.") || + schema.language.java?.namespace?.startsWith("com.azure.v2.core."))) || + (!this.isBranded() && schema.language.java?.namespace?.startsWith("io.clientcore.core.")) ) // because azure core v2 uses clientcore types ) From d714f3a3ec0ca9047ea521771d6b0f92f0983b38 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Mon, 29 Sep 2025 15:20:47 +0800 Subject: [PATCH 4/5] clientcore name is different --- packages/http-client-java/emitter/src/code-model-builder.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/http-client-java/emitter/src/code-model-builder.ts b/packages/http-client-java/emitter/src/code-model-builder.ts index fec24eda084..fbef93f6468 100644 --- a/packages/http-client-java/emitter/src/code-model-builder.ts +++ b/packages/http-client-java/emitter/src/code-model-builder.ts @@ -1824,7 +1824,10 @@ export class CodeModelBuilder { } } - const schemaName = groupToRequestConditions ? "RequestConditions" : "MatchConditions"; + let schemaName = groupToRequestConditions ? "RequestConditions" : "MatchConditions"; + if (!this.isBranded()) { + schemaName = "Http" + schemaName; + } const schemaDescription = groupToRequestConditions ? "Specifies HTTP options for conditional requests based on modification time." : "Specifies HTTP options for conditional requests."; From 9df909f7a1bfbbbb84f58b615c3ef643b7e0dcc2 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Thu, 9 Oct 2025 10:11:53 +0800 Subject: [PATCH 5/5] improve logic --- .../emitter/src/code-model-builder.ts | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/packages/http-client-java/emitter/src/code-model-builder.ts b/packages/http-client-java/emitter/src/code-model-builder.ts index fbef93f6468..849e35982b6 100644 --- a/packages/http-client-java/emitter/src/code-model-builder.ts +++ b/packages/http-client-java/emitter/src/code-model-builder.ts @@ -520,23 +520,33 @@ export class CodeModelBuilder { private deduplicateSchemaName() { // deduplicate model name + + // packages to skip + const packagesToSkip: string[] = []; + if (!this.isBranded() || this.isAzureV2()) { + // clientcore + packagesToSkip.push("io.clientcore.core."); + } + if (this.isAzureV2()) { + // core v2 + packagesToSkip.push("com.azure.v2.core."); + } + if (this.isAzureV1()) { + // core + packagesToSkip.push("com.azure.core."); + } + const nameCount = new Map(); const deduplicateName = (schema: Schema) => { + // skip models under "com.azure.core." etc. in java, or "Azure." in typespec, if branded + // skip models under "io.clientcore.core." in java, if unbranded + const skipDeduplicate = + (this.isBranded() && schema.language.default?.namespace?.startsWith("Azure.")) || + (schema.language.java?.namespace && + packagesToSkip.some((it) => schema.language.java?.namespace.startsWith(it))); + const name = schema.language.default.name; - if ( - name && - // skip models under "com.azure.core." in java, or "Azure." in typespec, if branded - !( - ( - (this.isBranded() && - (schema.language.java?.namespace?.startsWith("com.azure.core.") || - schema.language.default?.namespace?.startsWith("Azure.") || - schema.language.java?.namespace?.startsWith("com.azure.v2.core."))) || - (!this.isBranded() && - schema.language.java?.namespace?.startsWith("io.clientcore.core.")) - ) // because azure core v2 uses clientcore types - ) - ) { + if (name && !skipDeduplicate) { if (!nameCount.has(name)) { nameCount.set(name, 1); } else {