Skip to content

[http-client-csharp] Preserve API versions in input types - #11801

Open
Dapeng Zhang (ArcturusZhang) wants to merge 3 commits into
microsoft:mainfrom
ArcturusZhang:arcturus/csharp-input-api-versions
Open

[http-client-csharp] Preserve API versions in input types#11801
Dapeng Zhang (ArcturusZhang) wants to merge 3 commits into
microsoft:mainfrom
ArcturusZhang:arcturus/csharp-input-api-versions

Conversation

@ArcturusZhang

@ArcturusZhang Dapeng Zhang (ArcturusZhang) commented Sep 1, 2026

Copy link
Copy Markdown
Member

Summary

  • preserve TCGC API-version metadata on C# input models, enums, and model properties
  • append optional API-version metadata to the corresponding input-type constructors and deserialize it from the code model
  • default omitted API-version metadata to an empty list so existing downstream source calls continue to compile
  • regenerate local and Spector tspCodeModel.json fixtures with the new metadata

Validation

  • npm run build
  • npm test (240 emitter tests passed; 4,005 generator tests passed)
  • npm run format
  • eng/scripts/Generate.ps1 (67 code-model fixtures updated)

Fixes #11799

Downstream tracking: Azure/azure-sdk-for-net#62567

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

Copilot-Session: 204a5049-bd52-4eaa-8d56-8a89da54c191
@pkg-pr-new

pkg-pr-new Bot commented Sep 1, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@typespec/http-client-csharp@11801

commit: 0239fd0

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

No changes needing a change description found.

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

Copilot-Session: 204a5049-bd52-4eaa-8d56-8a89da54c191
@ArcturusZhang Dapeng Zhang (ArcturusZhang) changed the title [http-client-csharp] Preserve API versions on input models and properties [http-client-csharp] Preserve API versions in input types Sep 1, 2026
@ArcturusZhang
Dapeng Zhang (ArcturusZhang) marked this pull request as ready for review September 1, 2026 06:46
Copilot AI lite review requested due to automatic review settings September 1, 2026 06:46

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.

Pull request overview

This PR extends the http-client-csharp pipeline to preserve and round-trip TCGC apiVersions metadata on input models, enums, and model properties—ensuring the emitted tspCodeModel.json and the Microsoft.TypeSpec.Generator.Input layer both retain version-availability information for downstream generators.

Changes:

  • Plumb apiVersions through the TypeScript emitter input-type surface and conversion from TCGC SDK types.
  • Add ApiVersions to C# input types (InputModelType, InputEnumType, InputModelProperty) and deserialize it from the JSON code model.
  • Regenerate and update Spector/local tspCodeModel.json fixtures and add/extend unit tests to validate the new metadata.

Reviewed changes

Copilot reviewed 82 out of 82 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
packages/http-client-csharp/emitter/src/type/input-type.ts Add apiVersions to emitter input type interfaces (models/enums/properties).
packages/http-client-csharp/emitter/src/lib/type-converter.ts Copy apiVersions from TCGC SDK types into emitter input types during conversion.
packages/http-client-csharp/emitter/test/Unit/client-model-builder.test.ts Add unit test verifying apiVersions preservation for model/enum/property across versions.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/Serialization/InputModelTypeConverter.cs Deserialize apiVersions into InputModelType.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/Serialization/InputModelPropertyConverter.cs Deserialize apiVersions into InputModelProperty.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/Serialization/InputEnumTypeConverter.cs Deserialize apiVersions into InputEnumType.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/InputModelType.cs Add ApiVersions to InputModelType and propagate through update/clone paths.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/InputModelProperty.cs Add ApiVersions to InputModelProperty and support updates.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/InputEnumType.cs Add ApiVersions to InputEnumType.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/test/InputModelTypeTests.cs Add test validating model + property apiVersions deserialization.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/test/TypeSpecInputConverterTests.cs Extend enum deserialization test to assert ApiVersions.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/common/InputFactory.cs Extend factory helpers to accept/populate apiVersions when constructing input types.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/CanonicalTypeProviderTests.cs Update test construction to pass apiVersions for InputModelProperty.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/perf/CodeWriterBenchmark.cs Update perf benchmark construction to pass apiVersions for model/property.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/MrwSerializationTypeDefinitionTests.cs Update test models/properties to pass apiVersions.
packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/typeChangedFrom/v1/tspCodeModel.json Fixture update: include apiVersions for enums/models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/typeChangedFrom/v2/tspCodeModel.json Fixture update: include apiVersions for enums/models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/returnTypeChangedFrom/v1/tspCodeModel.json Fixture update: include apiVersions for enums.
packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/returnTypeChangedFrom/v2/tspCodeModel.json Fixture update: include apiVersions for enums.
packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/renamedFrom/v1/tspCodeModel.json Fixture update: include apiVersions for enums/models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/renamedFrom/v2/tspCodeModel.json Fixture update: include apiVersions for enums/models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/removed/v1/tspCodeModel.json Fixture update: include apiVersions for enums/models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/removed/v2Preview/tspCodeModel.json Fixture update: include apiVersions for enums/models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/removed/v2/tspCodeModel.json Fixture update: include apiVersions for enums/models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/madeOptional/v1/tspCodeModel.json Fixture update: include apiVersions for enums/models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/madeOptional/v2/tspCodeModel.json Fixture update: include apiVersions for enums/models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/added/v1/tspCodeModel.json Fixture update: include apiVersions for enums/models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/versioning/added/v2/tspCodeModel.json Fixture update: include apiVersions for enums/models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/tspCodeModel.json Fixture update: include empty apiVersions for unversioned types/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/type/property/value-types/tspCodeModel.json Fixture update: include empty apiVersions for unversioned types/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/type/property/optionality/tspCodeModel.json Fixture update: include empty apiVersions for unversioned types/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/type/property/nullable/tspCodeModel.json Fixture update: include empty apiVersions for unversioned types/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/visibility/tspCodeModel.json Fixture update: include empty apiVersions for unversioned models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/usage/tspCodeModel.json Fixture update: include empty apiVersions for unversioned models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/single-discriminator/tspCodeModel.json Fixture update: include empty apiVersions for inheritance shapes.
packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/recursive/tspCodeModel.json Fixture update: include empty apiVersions for recursive shapes.
packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/not-discriminated/tspCodeModel.json Fixture update: include empty apiVersions for inheritance shapes.
packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/nested-discriminator/tspCodeModel.json Fixture update: include empty apiVersions for nested discriminator shapes.
packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/inheritance/enum-discriminator/tspCodeModel.json Fixture update: include empty apiVersions for enum discriminator shapes.
packages/http-client-csharp/generator/TestProjects/Spector/http/type/model/empty/tspCodeModel.json Fixture update: include empty apiVersions for empty model fixtures.
packages/http-client-csharp/generator/TestProjects/Spector/http/type/enum/fixed/tspCodeModel.json Fixture update: include empty apiVersions for enums.
packages/http-client-csharp/generator/TestProjects/Spector/http/type/enum/extensible/tspCodeModel.json Fixture update: include empty apiVersions for enums.
packages/http-client-csharp/generator/TestProjects/Spector/http/type/dictionary/tspCodeModel.json Fixture update: include empty apiVersions for dictionary model/property.
packages/http-client-csharp/generator/TestProjects/Spector/http/type/array/tspCodeModel.json Fixture update: include empty apiVersions for array model/property.
packages/http-client-csharp/generator/TestProjects/Spector/http/streaming/sse/tspCodeModel.json Fixture update: include empty apiVersions for streaming models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/streaming/jsonl/tspCodeModel.json Fixture update: include empty apiVersions for streaming models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/special-headers/repeatability/tspCodeModel.json Fixture update: include empty apiVersions for enum fixture.
packages/http-client-csharp/generator/TestProjects/Spector/http/service/multiple-services/tspCodeModel.json Fixture update: include apiVersions for multi-service version enums.
packages/http-client-csharp/generator/TestProjects/Spector/http/server/versions/versioned/tspCodeModel.json Fixture update: include apiVersions for server versions enum.
packages/http-client-csharp/generator/TestProjects/Spector/http/server/path/multiple/tspCodeModel.json Fixture update: include apiVersions for versions enum.
packages/http-client-csharp/generator/TestProjects/Spector/http/serialization/encoded-name/json/tspCodeModel.json Fixture update: include empty apiVersions for model/property.
packages/http-client-csharp/generator/TestProjects/Spector/http/routes/tspCodeModel.json Fixture update: include empty apiVersions for model/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/response/status-code-range/tspCodeModel.json Fixture update: include empty apiVersions for error models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/resiliency/srv-driven/v1/tspCodeModel.json Fixture update: include apiVersions for versions enum.
packages/http-client-csharp/generator/TestProjects/Spector/http/resiliency/srv-driven/v2/tspCodeModel.json Fixture update: include apiVersions for versions enum.
packages/http-client-csharp/generator/TestProjects/Spector/http/payload/xml/tspCodeModel.json Fixture update: include empty apiVersions for XML models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/payload/pageable/tspCodeModel.json Fixture update: include empty apiVersions for pageable models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/payload/json-merge-patch/tspCodeModel.json Fixture update: include empty apiVersions for merge-patch models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/payload/content-negotiation/tspCodeModel.json Fixture update: include empty apiVersions for content negotiation models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/parameters/spread/tspCodeModel.json Fixture update: include empty apiVersions for spread request models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/parameters/body-root/tspCodeModel.json Fixture update: include empty apiVersions for body-root model/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/parameters/body-optionality/tspCodeModel.json Fixture update: include empty apiVersions for body model/property.
packages/http-client-csharp/generator/TestProjects/Spector/http/parameters/basic/tspCodeModel.json Fixture update: include empty apiVersions for basic parameter models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/encode/numeric/tspCodeModel.json Fixture update: include empty apiVersions for encode numeric models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/encode/duration/tspCodeModel.json Fixture update: include empty apiVersions for encode duration models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/encode/datetime/tspCodeModel.json Fixture update: include empty apiVersions for encode datetime models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/encode/bytes/tspCodeModel.json Fixture update: include empty apiVersions for encode bytes models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/encode/boolean/tspCodeModel.json Fixture update: include empty apiVersions for encode boolean models/properties.
packages/http-client-csharp/generator/TestProjects/Spector/http/encode/array/tspCodeModel.json Fixture update: include empty apiVersions for encode array models/properties/enums.
packages/http-client-csharp/generator/TestProjects/Spector/http/documentation/tspCodeModel.json Fixture update: include empty apiVersions for documentation fixtures.
packages/http-client-csharp/generator/TestProjects/Spector/http/client/structure/two-operation-group/tspCodeModel.json Fixture update: include empty apiVersions for client structure enum fixture.
packages/http-client-csharp/generator/TestProjects/Spector/http/client/structure/renamed-operation/tspCodeModel.json Fixture update: include empty apiVersions for client structure enum fixture.
packages/http-client-csharp/generator/TestProjects/Spector/http/client/structure/multi-client/tspCodeModel.json Fixture update: include empty apiVersions for client structure enum fixture.
packages/http-client-csharp/generator/TestProjects/Spector/http/client/structure/default/tspCodeModel.json Fixture update: include empty apiVersions for client structure enum fixture.
packages/http-client-csharp/generator/TestProjects/Spector/http/client/structure/client-operation-group/tspCodeModel.json Fixture update: include empty apiVersions for client structure enum fixture.
packages/http-client-csharp/generator/TestProjects/Spector/http/authentication/oauth2/tspCodeModel.json Fixture update: include empty apiVersions for auth error model/property.
packages/http-client-csharp/generator/TestProjects/Spector/http/authentication/http/custom/tspCodeModel.json Fixture update: include empty apiVersions for auth error model/property.
packages/http-client-csharp/generator/TestProjects/Spector/http/authentication/api-key/tspCodeModel.json Fixture update: include empty apiVersions for auth error model/property.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines 19 to 20
public InputModelType(string name, string @namespace, string crossLanguageDefinitionId, string? access, string? deprecation, string? summary, string? doc, InputModelTypeUsage usage, IReadOnlyList<InputModelProperty> properties, InputModelType? baseModel, IReadOnlyList<InputModelType> derivedModels, string? discriminatorValue, InputModelProperty? discriminatorProperty, IReadOnlyDictionary<string, InputModelType> discriminatedSubtypes, InputType? additionalProperties, bool modelAsStruct, InputSerializationOptions serializationOptions, bool isDynamicModel, IReadOnlyList<string> apiVersions)
: base(name)
Comment on lines 11 to 13
#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable.
public InputEnumType(string name, string @namespace, string crossLanguageDefinitionId, string? access, string? deprecation, string? summary, string? doc, InputModelTypeUsage usage, InputPrimitiveType valueType, IReadOnlyList<InputEnumTypeValue> values, bool isExtensible)
public InputEnumType(string name, string @namespace, string crossLanguageDefinitionId, string? access, string? deprecation, string? summary, string? doc, InputModelTypeUsage usage, InputPrimitiveType valueType, IReadOnlyList<InputEnumTypeValue> values, bool isExtensible, IReadOnlyList<string> apiVersions)
#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable.
Comment on lines +24 to +26
InputSerializationOptions serializationOptions,
ArrayKnownEncoding? encode = null)
ArrayKnownEncoding? encode,
IReadOnlyList<string> apiVersions)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 204a5049-bd52-4eaa-8d56-8a89da54c191
Copilot AI review requested due to automatic review settings September 1, 2026 09:10

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.

Pull request overview

Copilot reviewed 79 out of 79 changed files in this pull request and generated 1 comment.

Suppressed comments (1)

Previously missed (1) — in code that hasn't changed since the last review.

packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/Serialization/InputModelTypeConverter.cs:89

  • The JSON deserializer reads the summary property into the doc variable (TryReadString("summary", ref doc)), which prevents InputModelType.Summary from ever being populated and can also overwrite documentation when summary is present.
                    || reader.TryReadString("summary", ref doc)

Comment on lines +171 to 174
IReadOnlyList<string>? apiVersions = null)
{
var enumValues = new List<InputEnumTypeValue>();
var enumType = Enum(
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

emitter:client:csharp Issue for the C# client emitter: @typespec/http-client-csharp

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[http-client-csharp] Preserve API versions on input models, enums, and properties

3 participants