Skip to content

Fix duplicate inherited discriminators in Java models - #11824

Draft
Xiaofei Cao (XiaofeiCao) wants to merge 7 commits into
microsoft:mainfrom
XiaofeiCao:fix-java-duplicate-discriminators
Draft

Fix duplicate inherited discriminators in Java models#11824
Xiaofei Cao (XiaofeiCao) wants to merge 7 commits into
microsoft:mainfrom
XiaofeiCao:fix-java-duplicate-discriminators

Conversation

@XiaofeiCao

@XiaofeiCao Xiaofei Cao (XiaofeiCao) commented Sep 2, 2026

Copy link
Copy Markdown
Member

Summary

  • merge redundant leaf discriminator declarations with propagated parent discriminators
  • validate that duplicate declarations have matching constant values and Java types
  • emit fixed propagated discriminator fields as final without changing shared serialization behavior
  • regenerate Java clientcore and generator-test golden models

Fixes #11802

Testing

Merge redundant leaf discriminator declarations with propagated parent discriminators and preserve fixed discriminator fields as final.

Fixes microsoft#11802

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 54b93dc2-48ce-4250-a6ea-5bd9b9a7ab2b
@microsoft-github-policy-service microsoft-github-policy-service Bot added the emitter:client:java Issue for the Java client emitter: @typespec/http-client-java label Sep 2, 2026
@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

All changed packages have been documented.

  • @typespec/http-client-java
Show changes

@typespec/http-client-java - fix ✏️

Prevent duplicate Java discriminator members while preserving inherited discriminators in stream-style XML serialization.

@azure-sdk-automation

azure-sdk-automation Bot commented Sep 2, 2026

Copy link
Copy Markdown

You can try these changes here

🛝 Playground 🌐 Website 🛝 VSCode Extension

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 54b93dc2-48ce-4250-a6ea-5bd9b9a7ab2b
Keep active discriminators mutable so unknown values can round-trip through fallback deserialization, while fixed ancestor branch discriminators remain final.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 54b93dc2-48ce-4250-a6ea-5bd9b9a7ab2b
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 54b93dc2-48ce-4250-a6ea-5bd9b9a7ab2b

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

The changes are well-scoped to discriminator propagation/emission, include validation, and add/regenerate coverage via golden models for the reported edge case.

Pull request overview

Fixes Java model generation for nested polymorphic discriminators by merging redundant leaf discriminator declarations with propagated parent discriminators, preventing duplicate fields/accessors and making fixed inherited discriminators final where safe.

Changes:

  • Merge same-serialized-name discriminator properties during parent-discriminator propagation, with validation that constant value and types match.
  • Emit inherited fixed discriminator fields as final (while keeping the active discriminator mutable to preserve unknown values on fallback deserialization).
  • Add a discriminator edge-case TypeSpec scenario and regenerate Java golden outputs (generator-test and clientcore-test).
File summaries
File Description
packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelMapper.java Propagates parent discriminators as constant and merges duplicate child declarations to avoid duplicate emission.
packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/PolymorphicDiscriminatorHandler.java Makes fixed inherited discriminators final when they aren’t the active discriminator.
packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/implementation/ClientModelPropertiesManager.java Treats merged parent discriminators as masking ancestor properties during property management.
packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/ModelTemplate.java Ensures super-constructor argument resolution can see propagated parent discriminators.
packages/http-client-java/generator/http-client-generator-test/tsp/discriminator-edge-cases.tsp Adds a nested discriminator + duplicate leaf discriminator scenario to exercise merging behavior.
packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-discriminatoredgecases_metadata.json Regenerated metadata to include new discriminator edge-case models.
packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GrandChildWithNestedDiscriminator.java New golden model for nested discriminator hierarchy.
packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/GreatGrandChildWithDuplicateDiscriminator.java New golden leaf model that repeats propagated discriminator to validate merging.
packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/discriminatoredgecases/models/ChildWithRequiredPropertyAsDiscriminator.java Regenerated subtype dispatch to include the new nested discriminator branch.
packages/http-client-java/generator/http-client-generator-test/src/main/java/type/model/inheritance/nesteddiscriminator/models/Shark.java Regenerated golden: fixed discriminator field becomes final.
packages/http-client-java/generator/http-client-generator-test/src/main/java/type/model/inheritance/nesteddiscriminator/models/SawShark.java Regenerated golden: fixed discriminator field becomes final.
packages/http-client-java/generator/http-client-generator-test/src/main/java/type/model/inheritance/nesteddiscriminator/models/GoblinShark.java Regenerated golden: fixed discriminator field becomes final.
packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/patch/models/Shark.java Regenerated golden: fixed discriminator field becomes final.
packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/patch/models/SawShark.java Regenerated golden: fixed discriminator field becomes final.
packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/enumnesteddiscriminator/models/Shark.java Regenerated golden: fixed discriminator enum field becomes final.
packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/enumnesteddiscriminator/models/SawShark.java Regenerated golden: fixed discriminator enum field becomes final.
packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/enumnesteddiscriminator/models/GoblinShark.java Regenerated golden: fixed discriminator enum field becomes final.
packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/armstreamstyleserialization/models/Shark.java Regenerated golden: fixed discriminator field becomes final.
packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/armstreamstyleserialization/models/SawShark.java Regenerated golden: fixed discriminator field becomes final.
packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/armstreamstyleserialization/models/GoblinShark.java Regenerated golden: fixed discriminator field becomes final.
packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/type/model/inheritance/nesteddiscriminator/Shark.java Regenerated clientcore golden: fixed discriminator field becomes final.
packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/type/model/inheritance/nesteddiscriminator/SawShark.java Regenerated clientcore golden: fixed discriminator field becomes final.
packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/type/model/inheritance/nesteddiscriminator/GoblinShark.java Regenerated clientcore golden: fixed discriminator field becomes final.
.chronus/changes/fix-java-duplicate-discriminators-2026-09-02.md Changelog entry for the generator fix.
Review details
  • Files reviewed: 24/24 changed files
  • Comments generated: 1
  • Review effort level: Lite

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Xiaofei Cao (XiaofeiCao) added a commit to XiaofeiCao/typespec-azure that referenced this pull request Sep 4, 2026
Advance the pinned core commit to the latest microsoft/typespec#11824 head and resync its discriminator regression fixtures.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: e11a1a40-39fd-4e62-a567-584fde94178c
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 00e7fd30-d342-4b5a-ad7e-f16198c7dbde
Xiaofei Cao (XiaofeiCao) added a commit to XiaofeiCao/typespec-azure that referenced this pull request Sep 4, 2026
Advance to the latest microsoft/typespec#11824 commit and sync its XML discriminator regression fixture.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: e11a1a40-39fd-4e62-a567-584fde94178c

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

Core generator logic for polymorphic discriminator propagation and XML stream serialization is subtly behavior-affecting and should get a final human review despite tests/regenerations passing.

Review details
  • Files reviewed: 23/23 changed files
  • Comments generated: 1
  • Review effort level: Lite

Keep merged fixed discriminators in parentPolymorphicDiscriminators so JSON, constructors, and XML share one canonical representation.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 00e7fd30-d342-4b5a-ad7e-f16198c7dbde
Xiaofei Cao (XiaofeiCao) added a commit to XiaofeiCao/typespec-azure that referenced this pull request Sep 4, 2026
Advance to the latest microsoft/typespec#11824 commit and sync the restored propagated discriminator regression fixture.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: e11a1a40-39fd-4e62-a567-584fde94178c

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

It changes core polymorphic discriminator mapping and stream-style XML (de)serialization behavior, which can have broad downstream impact beyond the regenerated golden baselines.

Review details
  • Files reviewed: 28/28 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

Xiaofei Cao (XiaofeiCao) added a commit to XiaofeiCao/typespec-azure that referenced this pull request Sep 4, 2026
Pin the Java emitter to microsoft/typespec#11824 and sync its inherited discriminator regression case.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: e11a1a40-39fd-4e62-a567-584fde94178c
Xiaofei Cao (XiaofeiCao) added a commit to XiaofeiCao/typespec-azure that referenced this pull request Sep 4, 2026
Advance the pinned core commit to the latest microsoft/typespec#11824 head and resync its discriminator regression fixtures.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: e11a1a40-39fd-4e62-a567-584fde94178c
Xiaofei Cao (XiaofeiCao) added a commit to XiaofeiCao/typespec-azure that referenced this pull request Sep 4, 2026
Advance to the latest microsoft/typespec#11824 commit and sync its XML discriminator regression fixture.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: e11a1a40-39fd-4e62-a567-584fde94178c
Xiaofei Cao (XiaofeiCao) added a commit to XiaofeiCao/typespec-azure that referenced this pull request Sep 4, 2026
Advance to the latest microsoft/typespec#11824 commit and sync the restored propagated discriminator regression fixture.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: e11a1a40-39fd-4e62-a567-584fde94178c
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

emitter:client:java Issue for the Java client emitter: @typespec/http-client-java

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Java emitter generates duplicate fixed discriminator members in Realtime message leaves

2 participants