[http-client-csharp] Preserve API versions in input types - #11801
[http-client-csharp] Preserve API versions in input types#11801Dapeng Zhang (ArcturusZhang) wants to merge 3 commits into
Conversation
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 204a5049-bd52-4eaa-8d56-8a89da54c191
commit: |
|
No changes needing a change description found. |
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 204a5049-bd52-4eaa-8d56-8a89da54c191
There was a problem hiding this comment.
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
apiVersionsthrough the TypeScript emitter input-type surface and conversion from TCGC SDK types. - Add
ApiVersionsto C# input types (InputModelType,InputEnumType,InputModelProperty) and deserialize it from the JSON code model. - Regenerate and update Spector/local
tspCodeModel.jsonfixtures 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.
| 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) |
| #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. |
| 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
There was a problem hiding this comment.
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
summaryproperty into thedocvariable (TryReadString("summary", ref doc)), which preventsInputModelType.Summaryfrom ever being populated and can also overwrite documentation whensummaryis present.
|| reader.TryReadString("summary", ref doc)
| IReadOnlyList<string>? apiVersions = null) | ||
| { | ||
| var enumValues = new List<InputEnumTypeValue>(); | ||
| var enumType = Enum( |
Summary
tspCodeModel.jsonfixtures with the new metadataValidation
npm run buildnpm test(240 emitter tests passed; 4,005 generator tests passed)npm run formateng/scripts/Generate.ps1(67 code-model fixtures updated)Fixes #11799
Downstream tracking: Azure/azure-sdk-for-net#62567