Add model maximum overloads to Java clients - #11803
Conversation
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e5dff7f2-5849-4374-b6b3-9c7177834a21
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e5dff7f2-5849-4374-b6b3-9c7177834a21
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e5dff7f2-5849-4374-b6b3-9c7177834a21
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e5dff7f2-5849-4374-b6b3-9c7177834a21
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e5dff7f2-5849-4374-b6b3-9c7177834a21
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e5dff7f2-5849-4374-b6b3-9c7177834a21
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e5dff7f2-5849-4374-b6b3-9c7177834a21
…ax-overload # Conflicts: # packages/http-client-java/generator/http-client-generator-test/Generate.ps1 # packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataAsyncClient.java # packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataClient.java # packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataFileAsyncClient.java # packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataFileClient.java # packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsAsyncClient.java # packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsClient.java # packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsContentTypeAsyncClient.java # packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsContentTypeClient.java # packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsNonStringAsyncClient.java # packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsNonStringClient.java # packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/payload-multipart_metadata.json # packages/http-client-java/generator/http-client-generator-test/src/test/java/payload/multipart/MultipartTests.java
|
All changed packages have been documented.
Show changes
|
|
You can try these changes here
|
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e5dff7f2-5849-4374-b6b3-9c7177834a21
Add RequestOptions maximum overloads for pageable and LRO methods, including advanced-versioning signatures. Rename hidden protocol helpers when protocol API generation is disabled and cover signature collisions and sync-over-async delegation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e5dff7f2-5849-4374-b6b3-9c7177834a21
Include the full generated client, metadata, and service-name conflict fixture output required by the Java regeneration checks. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e5dff7f2-5849-4374-b6b3-9c7177834a21
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e5dff7f2-5849-4374-b6b3-9c7177834a21
There was a problem hiding this comment.
🟡 Changes recommended
ClientMapper.parseHeader uses JavaSettings.getInstance() instead of its settings parameter, which can yield incorrect behavior when settings aren’t truly global.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Adds support for generating “model maximum overloads” in the TypeSpec Java generator (Azure flavor) via a max-overload=model option, producing public strongly-typed max overloads while keeping protocol methods internal (renamed with *Internal), and extending coverage to headers-as-model, void responses, paging/LRO, multipart, and name-collision scenarios.
Changes:
- Plumbs
max-overloadthrough emitter options into generator settings and addsJavaSettings.isModelMaxOverload(). - Updates client/method naming and templates to generate public model max overloads and rename hidden protocol helpers to
*Internal. - Adds new TypeSpec specs and JUnit tests (plus regenerated test outputs/metadata) to validate overload behavior, typed headers, paging/LRO, multipart, and
ServiceClientname collisions.
File summaries
| File | Description |
|---|---|
| packages/http-client-java/generator/http-client-generator/src/test/java/com/microsoft/typespec/http/client/generator/model/EmitterOptionsTests.java | Adds unit test coverage for parsing max-overload. |
| packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/TypeSpecPlugin.java | Passes max-overload into the generator settings map. |
| packages/http-client-java/generator/http-client-generator/src/main/java/com/microsoft/typespec/http/client/generator/model/EmitterOptions.java | Adds maxOverload option parsing and accessor. |
| packages/http-client-java/generator/http-client-generator-test/tsp/service-client-name-conflict.tsp | New TypeSpec scenario validating ServiceClient annotation name collision handling. |
| packages/http-client-java/generator/http-client-generator-test/tsp/protocol-api-sync-over-async.tsp | Extends sync-over-async protocol API scenario with pageable resource listing. |
| packages/http-client-java/generator/http-client-generator-test/tsp/max-overload-model.tsp | New TypeSpec scenario to exercise model max overloads (WithResponse/pageable/LRO/headers/internal). |
| packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/serviceclientnameconflict/generated/ServiceClientNameConflictClientTestBase.java | Generated test base for the service-client name conflict scenario. |
| packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/protocolapisyncoverasync/ProtocolApiSyncOverAsyncTests.java | Adds reflection assertions for *Internal naming on list methods. |
| packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/maxoverloadmodel/MaxOverloadModelTests.java | New reflection-based tests for model max overload generation and visibility rules. |
| packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/maxoverloadmodel/generated/MaxOverloadModelClientTestBase.java | Generated test base for the max-overload-model scenario. |
| packages/http-client-java/generator/http-client-generator-test/src/test/java/payload/multipart/MultipartTests.java | Updates multipart tests to validate strongly-typed WithResponse overloads returning Response<Void>. |
| packages/http-client-java/generator/http-client-generator-test/src/test/java/payload/head/HeadTests.java | Updates HEAD tests to validate typed deserialized response headers via ResponseBase. |
| packages/http-client-java/generator/http-client-generator-test/src/test/java/parameters/basic/BasicClientTests.java | Updates basic parameter tests to use typed WithResponse(..., RequestOptions) overloads. |
| packages/http-client-java/generator/http-client-generator-test/src/test/java/azure/core/basic/CoreTests.java | Updates Azure Core basic tests to exercise typed WithResponse overloads. |
| packages/http-client-java/generator/http-client-generator-test/src/main/resources/tsptest-serviceclientnameconflict.properties | Adds test resource properties for new scenario. |
| packages/http-client-java/generator/http-client-generator-test/src/main/resources/tsptest-maxoverloadmodel.properties | Adds test resource properties for new scenario. |
| packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-serviceclientnameconflict_metadata.json | Adds generated metadata for new scenario. |
| packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-responseheaders_metadata.json | Updates generated metadata after header-model related changes. |
| packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-protocolapisyncoverasync_metadata.json | Updates generated metadata to include new list operations/internal naming. |
| packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-protocolandconvenient_metadata.json | Updates generated metadata to reflect *Internal protocol helper renames. |
| packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-maxoverloadmodel_metadata.json | Adds generated metadata for max-overload-model scenario. |
| packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-internal_metadata.json | Updates generated metadata after internal API/header model adjustments. |
| packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/payload-head_metadata.json | Updates generated metadata to include internal WithResponse helpers and header models. |
| packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/parameters-basic_metadata.json | Updates generated metadata to include internal WithResponse helpers. |
| packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/azure-core-basic_metadata.json | Updates generated metadata to include internal WithResponse helpers and internal paging helpers. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/serviceclientnameconflict/ServiceClientNameConflictClient.java | Generated sync client validating ServiceClient name collision handling. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/serviceclientnameconflict/ServiceClientNameConflictAsyncClient.java | Generated async client validating ServiceClient name collision handling. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/serviceclientnameconflict/ServiceClient.java | Generated class named ServiceClient to exercise annotation import/name collision path. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/serviceclientnameconflict/ServiceAsyncClient.java | Generated async service client for name-collision scenario. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/serviceclientnameconflict/package-info.java | Generated package docs for new scenario. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/serviceclientnameconflict/implementation/ServicesImpl.java | Generated service operations impl for name-collision scenario. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/serviceclientnameconflict/implementation/ServiceClientNameConflictClientImpl.java | Generated protocol client impl for name-collision scenario. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/serviceclientnameconflict/implementation/package-info.java | Generated implementation package docs for new scenario. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/protocolapisyncoverasync/ProtocolApiSyncOverAsyncClient.java | Generated sync client with internal protocol helpers and typed pageable convenience. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/protocolapisyncoverasync/ProtocolApiSyncOverAsyncAsyncClient.java | Generated async client with internal protocol helpers and typed pageable convenience. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/protocolapisyncoverasync/models/ResourceModel.java | Generated model used by the new resource list scenario. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/protocolapisyncoverasync/implementation/ProtocolApiSyncOverAsyncClientImpl.java | Generated impl adds pageable protocol operations and helpers. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/protocolandconvenient/ProtocolAndConvenientClient.java | Updates generated client to rename hidden protocol helpers to *Internal. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/protocolandconvenient/ProtocolAndConvenientAsyncClient.java | Updates generated async client to rename hidden protocol helpers to *Internal. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/protocolandconvenient/implementation/ProtocolAndConvenienceOpsImpl.java | Updates generated implementation to rename hidden protocol helpers to *Internal. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/maxoverloadmodel/package-info.java | Generated package docs for new max-overload-model scenario. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/maxoverloadmodel/models/ResponseModel.java | Generated response model used by WithResponse overload tests. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/maxoverloadmodel/models/ResourceWithoutOptionsModel.java | Generated model used for parameterless pageable overload tests. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/maxoverloadmodel/models/ResourceModel.java | Generated resource model used across LRO/pageable scenarios. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/maxoverloadmodel/models/RequestStatus.java | Generated enum used by typed header models. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/maxoverloadmodel/models/RequestModel.java | Generated request model used by model max overload tests. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/maxoverloadmodel/models/package-info.java | Generated model package docs for new scenario. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/maxoverloadmodel/models/GetWithHeadersHeaders.java | Generated typed headers model for response headers in convenience responses. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/maxoverloadmodel/models/GetResourceMetadataHeaders.java | Generated typed headers model used as the response body for HEAD-with-typed-headers. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/maxoverloadmodel/MaxOverloadModelServiceVersion.java | Generated service version enum for advanced versioning scenario. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/maxoverloadmodel/implementation/SyncOperationLocationPollingStrategy.java | Generated LRO polling helper used by max-overload-model scenario. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/maxoverloadmodel/implementation/PollingUtils.java | Generated polling helper utilities. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/maxoverloadmodel/implementation/package-info.java | Generated implementation package docs for new scenario. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/maxoverloadmodel/implementation/OperationLocationPollingStrategy.java | Generated async polling helper used by max-overload-model scenario. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/maxoverloadmodel/implementation/models/package-info.java | Generated internal-model package docs for new scenario. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/maxoverloadmodel/implementation/models/GetInternalHeadersHeaders.java | Generated internal-only typed headers model for internal API operation. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsNonStringClient.java | Updates generated multipart clients to include typed max WithResponse overloads. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsNonStringAsyncClient.java | Updates generated multipart async clients to include typed max WithResponse overloads. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsContentTypeClient.java | Updates generated multipart content-type clients to include typed max WithResponse overloads. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsContentTypeAsyncClient.java | Updates generated multipart content-type async clients to include typed max WithResponse overloads. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsClient.java | Updates generated multipart mixed-parts clients to include typed max WithResponse overloads. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataHttpPartsAsyncClient.java | Updates generated multipart mixed-parts async clients to include typed max WithResponse overloads. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataFileClient.java | Updates generated multipart file clients to include typed max WithResponse overloads. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/multipart/FormDataFileAsyncClient.java | Updates generated multipart file async clients to include typed max WithResponse overloads. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/head/models/package-info.java | Adds generated model package docs for typed HEAD response headers. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/head/models/ContentTypeHeaderInResponseHeaders.java | Adds generated typed headers model for HEAD response headers. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/head/implementation/HeadClientImpl.java | Renames protocol helpers to *Internal for the HEAD scenario. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/head/HeadClient.java | Generates internal protocol method and convenience method returning ResponseBase with deserialized headers. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/payload/head/HeadAsyncClient.java | Async equivalent for internal protocol method + ResponseBase convenience response. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/parameters/basic/ImplicitBodyClient.java | Generates internal protocol WithResponse and public typed max WithResponse overload. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/parameters/basic/ImplicitBodyAsyncClient.java | Async equivalent for internal protocol WithResponse and typed max overload. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/parameters/basic/implementation/ImplicitBodiesImpl.java | Renames protocol impl WithResponse methods to *Internal. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/parameters/basic/implementation/ExplicitBodiesImpl.java | Renames protocol impl WithResponse methods to *Internal. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/parameters/basic/ExplicitBodyClient.java | Generates internal protocol WithResponse and public typed max WithResponse overload. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/parameters/basic/ExplicitBodyAsyncClient.java | Async equivalent for internal protocol WithResponse and typed max overload. |
| packages/http-client-java/generator/http-client-generator-test/src/main/java/azure/core/basic/implementation/BasicClientImpl.java | Renames protocol WithResponse and paging helpers to *Internal. |
| packages/http-client-java/generator/http-client-generator-test/Generate.ps1 | Enables max-overload=model for representative E2E scenarios and adds advanced-versioning case for new spec. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/MethodNamer.java | Adds helpers for generating *Internal and internal async/LRO method names. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ServiceSyncClientTemplate.java | Avoids ServiceClient annotation import collision by using fully-qualified annotation when needed. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ConvenienceSyncMethodTemplate.java | Adds wrapping logic for typed response headers, void responses, and ResponseBase value preservation. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ConvenienceMethodTemplateBase.java | Centralizes BinaryData conversion logic and ensures RequestOptions initialization when present. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ConvenienceAsyncMethodTemplate.java | Adds async wrapping logic for typed response headers/ResponseBase/SimpleResponse conversions. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ClientMethodTemplate.java | Fixes paging sync delegation to call the correct async method name after internal renames. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ResponseTypeFactory.java | Adjusts response type mapping for responseHeadersAsModel scenarios. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ClientMapper.java | Ensures typed header schemas are parsed/marked for generation for responseHeadersAsModel and model max overloads. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/clientcore/ClientCoreClientMethodMapper.java | Aligns context-parameter mapping with updated base signature. |
| packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/extension/plugin/JavaSettings.java | Reads max-overload=model and exposes isModelMaxOverload(). |
| packages/http-client-java/emitter/src/code-model-builder.ts | Adds emitter option typing and logic to suppress public protocol API when max-overload=model for Azure v1 convenience APIs; tracks schema usage for typed header models. |
| .chronus/changes/http-client-java-model-max-overload-2026-09-01.md | Adds changelog entry for the new max-overload: model feature. |
Review details
- Files reviewed: 98/100 changed files
- Comments generated: 1
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
🟡 Changes recommended
The new max-overload setting is written into a static mutable settings map without clearing when unset, which can leak configuration across generator runs in the same JVM.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review details
- Files reviewed: 98/100 changed files
- Comments generated: 1
- Review effort level: Lite
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e5dff7f2-5849-4374-b6b3-9c7177834a21
There was a problem hiding this comment.
🔵 Needs a closer look
The change spans core emitter/generator mapping and multiple codegen templates with broad regenerated outputs, making subtle behavior regressions difficult to rule out automatically.
Review details
- Files reviewed: 98/100 changed files
- Comments generated: 0 new
- Review effort level: Lite
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e5dff7f2-5849-4374-b6b3-9c7177834a21
There was a problem hiding this comment.
🔵 Needs a closer look
It changes multiple core generator templates/mappers and refreshes many generated baselines across paging/LRO/multipart/typed-headers, which warrants final human review despite tests.
Review details
Suppressed comments (1)
Previously missed (1) — in code that hasn't changed since the last review.
packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/protocolapisyncoverasync/ProtocolApiSyncOverAsyncClient.java:142
- The sync
listconvenience method claims to be generated forlistInternal, but it bypasseslistInternaland delegates to the async client'slist(...). This is inconsistent with other sync-over-async conveniences and makes the comment misleading. Prefer calling the locallistInternal(...)and mappingBinaryDatatoResourceModelon the sync side (same pattern used elsewhere viamapPage).
- Files reviewed: 106/108 changed files
- Comments generated: 0 new
- Review effort level: Lite
## Summary - pin `@azure-tools/typespec-java` to merged microsoft/typespec commit `a32575719` - sync the Java fixtures and tests from microsoft/typespec#11803 - enable `max-overload=model` for representative data-plane and versioning cases - preserve the sync-over-async test configuration ## Validation - `pnpm build && pnpm test` - `pnpm -w format && pnpm -w lint` - remote Java regeneration and Spector tests --------- Copilot-Session: 4b7d9e20-102d-4966-bb3b-01535ed22c2b
Fixes the second part of #10742.
Summary
max-overload=modelgenerator option for Azure Java clientsWithResponse, pageable, and LRO overloads ending inRequestOptions*Internalwhen protocol API generation is disabledServiceClientannotation name collisionsTesting