From 26b702d3bcc0148c50c6da90bdb566bf123d012a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 7 Apr 2026 09:30:40 +0000 Subject: [PATCH 1/3] Initial plan From 4a40a87231761b6dc082ba430c2da3bdd8a3b00d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 7 Apr 2026 09:42:52 +0000 Subject: [PATCH 2/3] fix: preserve enum type when @alternateType collapses single-member enum to constant Agent-Logs-Url: https://github.com/microsoft/typespec/sessions/f1259764-9aff-4b82-87b9-341ba62673a2 Co-authored-by: live1206 <5196139+live1206@users.noreply.github.com> --- .../emitter/src/lib/type-converter.ts | 15 ++++++---- .../emitter/test/Unit/constant-type.test.ts | 29 +++++++++++++++++++ 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/packages/http-client-csharp/emitter/src/lib/type-converter.ts b/packages/http-client-csharp/emitter/src/lib/type-converter.ts index ded35eb85e8..e535af0ec11 100644 --- a/packages/http-client-csharp/emitter/src/lib/type-converter.ts +++ b/packages/http-client-csharp/emitter/src/lib/type-converter.ts @@ -118,12 +118,17 @@ export function fromSdkType( typeof sdkProperty.serializedName === "string" && sdkProperty.serializedName.toLocaleLowerCase() === "content-type"; + // Check if the original property type was an enum (e.g., when @alternateType collapses + // a single-member enum to a constant) - preserve the enum type in this case + const isOriginalTypeEnum = sdkProperty?.__raw?.type?.kind === "Enum"; + if ( - sdkProperty && - !isContentTypeHeader && - (sdkProperty.optional || sdkProperty?.type.kind === "nullable") && - sdkProperty?.type.kind !== "boolean" && - sdkType.valueType.kind !== "boolean" + (sdkProperty && + !isContentTypeHeader && + (sdkProperty.optional || sdkProperty?.type.kind === "nullable") && + sdkProperty?.type.kind !== "boolean" && + sdkType.valueType.kind !== "boolean") || + isOriginalTypeEnum ) { // turn the constant into an extensible enum retVar = diagnostics.pipe(createEnumType(sdkContext, sdkType, namespace!)); diff --git a/packages/http-client-csharp/emitter/test/Unit/constant-type.test.ts b/packages/http-client-csharp/emitter/test/Unit/constant-type.test.ts index 3730f08dbdd..6105a08a5cc 100644 --- a/packages/http-client-csharp/emitter/test/Unit/constant-type.test.ts +++ b/packages/http-client-csharp/emitter/test/Unit/constant-type.test.ts @@ -149,4 +149,33 @@ describe("Constant enum conversion", () => { strictEqual(enumType.access, undefined); strictEqual(enumType.usage, UsageFlags.Input | UsageFlags.Json); }); + + it("single-member enum with @alternateType should preserve enum type for required property", async () => { + const program = await typeSpecCompile( + ` + enum Colors { + green, + } + + model TestModel { + @alternateType("green") + prop: Colors; + } + + op test(@body input: TestModel): void; + `, + runner, + { IsTCGCNeeded: true }, + ); + const context = createEmitterContext(program); + const sdkContext = await createCSharpSdkContext(context); + const [root] = createModel(sdkContext); + const testModel = root.models.find((m) => m.name === "TestModel"); + ok(testModel); + const propertyType = testModel.properties[0].type; + strictEqual(propertyType.kind, "enum"); + const enumType = propertyType as InputEnumType; + strictEqual(enumType.values.length, 1); + strictEqual(enumType.values[0].value, "green"); + }); }); From 67380b375cecc211c2f4760f75809e6cd54f40b3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 7 Apr 2026 09:46:31 +0000 Subject: [PATCH 3/3] refactor: improve condition clarity and add isFixed assertion per review feedback Agent-Logs-Url: https://github.com/microsoft/typespec/sessions/f1259764-9aff-4b82-87b9-341ba62673a2 Co-authored-by: live1206 <5196139+live1206@users.noreply.github.com> --- .../emitter/src/lib/type-converter.ts | 11 ++++++----- .../emitter/test/Unit/constant-type.test.ts | 1 + 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/http-client-csharp/emitter/src/lib/type-converter.ts b/packages/http-client-csharp/emitter/src/lib/type-converter.ts index e535af0ec11..23d9346badb 100644 --- a/packages/http-client-csharp/emitter/src/lib/type-converter.ts +++ b/packages/http-client-csharp/emitter/src/lib/type-converter.ts @@ -120,15 +120,16 @@ export function fromSdkType( // Check if the original property type was an enum (e.g., when @alternateType collapses // a single-member enum to a constant) - preserve the enum type in this case - const isOriginalTypeEnum = sdkProperty?.__raw?.type?.kind === "Enum"; + const isOriginalTypeEnum = + sdkProperty !== undefined && sdkProperty.__raw?.type?.kind === "Enum"; if ( - (sdkProperty && - !isContentTypeHeader && - (sdkProperty.optional || sdkProperty?.type.kind === "nullable") && + sdkProperty && + !isContentTypeHeader && + (((sdkProperty.optional || sdkProperty?.type.kind === "nullable") && sdkProperty?.type.kind !== "boolean" && sdkType.valueType.kind !== "boolean") || - isOriginalTypeEnum + isOriginalTypeEnum) ) { // turn the constant into an extensible enum retVar = diagnostics.pipe(createEnumType(sdkContext, sdkType, namespace!)); diff --git a/packages/http-client-csharp/emitter/test/Unit/constant-type.test.ts b/packages/http-client-csharp/emitter/test/Unit/constant-type.test.ts index 6105a08a5cc..46f38ad8c1b 100644 --- a/packages/http-client-csharp/emitter/test/Unit/constant-type.test.ts +++ b/packages/http-client-csharp/emitter/test/Unit/constant-type.test.ts @@ -175,6 +175,7 @@ describe("Constant enum conversion", () => { const propertyType = testModel.properties[0].type; strictEqual(propertyType.kind, "enum"); const enumType = propertyType as InputEnumType; + strictEqual(enumType.isFixed, false); strictEqual(enumType.values.length, 1); strictEqual(enumType.values[0].value, "green"); });