diff --git a/packages/typespec-client-generator-core/CHANGELOG.md b/packages/typespec-client-generator-core/CHANGELOG.md index 9eb727a2c..5b9c1ebea 100644 --- a/packages/typespec-client-generator-core/CHANGELOG.md +++ b/packages/typespec-client-generator-core/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log - @azure-tools/typespec-client-generator-core +## 0.47.1 + +### Bug Fixes + +- [#1659](https://github.com/Azure/typespec-azure/pull/1659) remove projection for source model since typespec core has already fixed the issue + + ## 0.47.0 ### Bug Fixes diff --git a/packages/typespec-client-generator-core/package.json b/packages/typespec-client-generator-core/package.json index 4d85e7184..78401259b 100644 --- a/packages/typespec-client-generator-core/package.json +++ b/packages/typespec-client-generator-core/package.json @@ -1,6 +1,6 @@ { "name": "@azure-tools/typespec-client-generator-core", - "version": "0.47.0", + "version": "0.47.1", "author": "Microsoft Corporation", "description": "TypeSpec Data Plane Generation library", "homepage": "https://azure.github.io/typespec-azure", diff --git a/packages/typespec-client-generator-core/src/http.ts b/packages/typespec-client-generator-core/src/http.ts index 3d0f35589..d760af0a4 100644 --- a/packages/typespec-client-generator-core/src/http.ts +++ b/packages/typespec-client-generator-core/src/http.ts @@ -166,7 +166,7 @@ function getSdkHttpParameters( type = diagnostics.pipe( getClientTypeWithDiagnostics( context, - getHttpBodySpreadModel(context, tspBody.type as Model), + getHttpBodySpreadModel(tspBody.type as Model), httpOperation.operation, ), ); diff --git a/packages/typespec-client-generator-core/src/internal-utils.ts b/packages/typespec-client-generator-core/src/internal-utils.ts index c44e34026..a7779e10d 100644 --- a/packages/typespec-client-generator-core/src/internal-utils.ts +++ b/packages/typespec-client-generator-core/src/internal-utils.ts @@ -15,7 +15,6 @@ import { NumericLiteral, Operation, Program, - ProjectedProgram, StringLiteral, Type, Union, @@ -526,10 +525,9 @@ export function isHttpBodySpread(httpBody: HttpOperationBody | HttpOperationMult * @param type * @returns */ -export function getHttpBodySpreadModel(context: TCGCContext, type: Model): Model { +export function getHttpBodySpreadModel(type: Model): Model { if (type.sourceModels.length === 1 && type.sourceModels[0].usage === "spread") { const innerModel = type.sourceModels[0].model; - const projectedProgram = context.program as ProjectedProgram; // for case: `op test(...Model):void;` if (innerModel.name !== "" && innerModel.properties.size === type.properties.size) { return innerModel; @@ -541,9 +539,7 @@ export function getHttpBodySpreadModel(context: TCGCContext, type: Model): Model innerModel.sourceModels[0].model.name !== "" && innerModel.sourceModels[0].model.properties.size === type.properties.size ) { - return projectedProgram.projector - ? (projectedProgram.projector.projectedTypes.get(innerModel.sourceModels[0].model) as Model) - : innerModel.sourceModels[0].model; + return innerModel.sourceModels[0].model; } } return type; diff --git a/packages/typespec-client-generator-core/src/public-utils.ts b/packages/typespec-client-generator-core/src/public-utils.ts index 9bea367f7..ae46396d4 100644 --- a/packages/typespec-client-generator-core/src/public-utils.ts +++ b/packages/typespec-client-generator-core/src/public-utils.ts @@ -383,7 +383,7 @@ function getContextPath( result = [{ name: root.name }]; let bodyType: Type; if (isHttpBodySpread(httpOperation.parameters.body)) { - bodyType = getHttpBodySpreadModel(context, httpOperation.parameters.body.type as Model); + bodyType = getHttpBodySpreadModel(httpOperation.parameters.body.type as Model); } else { bodyType = httpOperation.parameters.body.type; } diff --git a/packages/typespec-client-generator-core/src/types.ts b/packages/typespec-client-generator-core/src/types.ts index 380cce1cd..c39d338b7 100644 --- a/packages/typespec-client-generator-core/src/types.ts +++ b/packages/typespec-client-generator-core/src/types.ts @@ -1345,7 +1345,7 @@ export function getSdkModelPropertyType( const httpBody = httpOperation.parameters.body; if (httpBody) { const httpBodyType = isHttpBodySpread(httpBody) - ? getHttpBodySpreadModel(context, httpBody.type as Model) + ? getHttpBodySpreadModel(httpBody.type as Model) : httpBody.type; if (type.model === httpBodyType) { // only try to add multipartOptions for property of body @@ -1560,7 +1560,7 @@ function updateTypesFromOperation( sdkType = diagnostics.pipe( getClientTypeWithDiagnostics( context, - getHttpBodySpreadModel(context, httpBody.type as Model), + getHttpBodySpreadModel(httpBody.type as Model), operation, ), ); diff --git a/packages/typespec-client-generator-core/test/packages/spread.test.ts b/packages/typespec-client-generator-core/test/packages/spread.test.ts index 6de7bf224..d35fce0da 100644 --- a/packages/typespec-client-generator-core/test/packages/spread.test.ts +++ b/packages/typespec-client-generator-core/test/packages/spread.test.ts @@ -1,7 +1,12 @@ import { AzureCoreTestLibrary } from "@azure-tools/typespec-azure-core/testing"; import { deepStrictEqual, ok, strictEqual } from "assert"; import { beforeEach, describe, it } from "vitest"; -import { SdkClientType, SdkHttpOperation, UsageFlags } from "../../src/interfaces.js"; +import { + SdkClientType, + SdkHttpOperation, + SdkServiceMethod, + UsageFlags, +} from "../../src/interfaces.js"; import { getAllModels } from "../../src/types.js"; import { SdkTestRunner, createSdkTestRunner } from "../test-host.js"; import { getServiceMethodOfClient } from "./utils.js"; @@ -920,10 +925,14 @@ describe("typespec-client-generator-core: spread", () => { @route("modelref1") @post op ref1(...Test): void; - + @route("modelref2") @post - op ref2(@body body: Ref): void; + op ref2(@header header: string, ...Test): void; + + @route("modelref3") + @post + op ref3(@body body: Ref): void; `); const sdkPackage = runner.context.sdkPackage; strictEqual(sdkPackage.models.length, 2); @@ -936,5 +945,19 @@ describe("typespec-client-generator-core: spread", () => { strictEqual(sdkPackage.models[1].name, "Ref"); strictEqual(sdkPackage.models[1].usage, UsageFlags.Input | UsageFlags.Json); strictEqual(sdkPackage.models[1].access, "public"); + + const client = sdkPackage.clients[0]; + deepStrictEqual( + (client.methods[0] as SdkServiceMethod).operation.bodyParam?.type, + sdkPackage.models[0], + ); + deepStrictEqual( + (client.methods[1] as SdkServiceMethod).operation.bodyParam?.type, + sdkPackage.models[0], + ); + deepStrictEqual( + (client.methods[2] as SdkServiceMethod).operation.bodyParam?.type, + sdkPackage.models[1], + ); }); });