Description
The C# generator represents TypeSpec unions as BinaryData while retaining the original union item types as metadata on CSharpType. The provider reference map currently treats that metadata as a reachability edge even when a variant is explicitly internal.
As a result, an internal model whose only inbound reference is an erased BinaryData union item is still emitted, even though no generated CLR signature or implementation code uses the model. Public XML documentation may also mention that inaccessible model.
The current behavior is covered by ProviderReferenceMapAnalyzerTests.BinaryDataUnionPropertyDoesNotPublicizeInternalUnionMembers, introduced in #11288 during the provider-reference-map migration. The test ensures that the variant is not promoted to public, but also requires ShouldWriteProvider to return true. Investigation did not find a concrete runtime or product requirement for retaining the model; the assertion appears to preserve migration behavior.
This was discussed in #11839 while fixing loss of union metadata during back-compat type replacement. Metadata preservation and the policy for interpreting that metadata should remain separate concerns.
Desired behavior
- An explicitly internal variant referenced only through erased
BinaryData union metadata should not be considered reachable and should not be emitted.
- An internal variant with a genuine implementation dependency—such as generated serialization code, custom code, a discriminator relationship, or another concrete generated reference—should remain internal and be emitted.
- Existing API-contract/baseline retention should continue to apply independently.
- Public union variants and their public-surface reachability should remain unaffected.
- Public XML documentation should not reference internal or removed union variants.
Test coverage
Replace or split BinaryDataUnionPropertyDoesNotPublicizeInternalUnionMembers so coverage independently verifies:
- An internal variant referenced only by
BinaryData union metadata is not written.
- An internal variant with a real implementation reference remains internal and is written.
- Public XML documentation excludes internal or removed union variants.
Context
- by copilot
Description
The C# generator represents TypeSpec unions as
BinaryDatawhile retaining the original union item types as metadata onCSharpType. The provider reference map currently treats that metadata as a reachability edge even when a variant is explicitly internal.As a result, an internal model whose only inbound reference is an erased
BinaryDataunion item is still emitted, even though no generated CLR signature or implementation code uses the model. Public XML documentation may also mention that inaccessible model.The current behavior is covered by
ProviderReferenceMapAnalyzerTests.BinaryDataUnionPropertyDoesNotPublicizeInternalUnionMembers, introduced in #11288 during the provider-reference-map migration. The test ensures that the variant is not promoted to public, but also requiresShouldWriteProviderto returntrue. Investigation did not find a concrete runtime or product requirement for retaining the model; the assertion appears to preserve migration behavior.This was discussed in #11839 while fixing loss of union metadata during back-compat type replacement. Metadata preservation and the policy for interpreting that metadata should remain separate concerns.
Desired behavior
BinaryDataunion metadata should not be considered reachable and should not be emitted.Test coverage
Replace or split
BinaryDataUnionPropertyDoesNotPublicizeInternalUnionMembersso coverage independently verifies:BinaryDataunion metadata is not written.Context
- by copilot