diff --git a/.chronus/changes/onClientSetting-2024-8-17-17-22-46.md b/.chronus/changes/onClientSetting-2024-8-17-17-22-46.md new file mode 100644 index 0000000000..1dafa8571f --- /dev/null +++ b/.chronus/changes/onClientSetting-2024-8-17-17-22-46.md @@ -0,0 +1,7 @@ +--- +changeKind: fix +packages: + - "@azure-tools/typespec-client-generator-core" +--- + +fix `onClient` setting for client initialization parameters applied to an interface \ No newline at end of file diff --git a/packages/typespec-client-generator-core/src/internal-utils.ts b/packages/typespec-client-generator-core/src/internal-utils.ts index bad7494cf1..1c50f7c221 100644 --- a/packages/typespec-client-generator-core/src/internal-utils.ts +++ b/packages/typespec-client-generator-core/src/internal-utils.ts @@ -582,8 +582,12 @@ export function getHttpBodySpreadModel(context: TCGCContext, type: Model): Model return type; } -export function isOnClient(context: TCGCContext, type: ModelProperty): boolean { - const namespace = type.model?.namespace; +export function isOnClient( + context: TCGCContext, + type: ModelProperty, + operation?: Operation +): boolean { + const namespace = operation ? getLocationOfOperation(operation) : type.model?.namespace; return ( isSubscriptionId(context, type) || isApiVersion(context, type) || diff --git a/packages/typespec-client-generator-core/src/types.ts b/packages/typespec-client-generator-core/src/types.ts index 324db92a7e..8f583aec32 100644 --- a/packages/typespec-client-generator-core/src/types.ts +++ b/packages/typespec-client-generator-core/src/types.ts @@ -1196,7 +1196,7 @@ export function getSdkModelPropertyTypeBase( } const docWrapper = getDocHelper(context, type); const name = getPropertyNames(context, type)[0]; - const onClient = isOnClient(context, type); + const onClient = isOnClient(context, type, operation); return diagnostics.wrap({ __raw: type, description: docWrapper.description, diff --git a/packages/typespec-client-generator-core/test/decorators.test.ts b/packages/typespec-client-generator-core/test/decorators.test.ts index c04c7c36af..8ea0c431dc 100644 --- a/packages/typespec-client-generator-core/test/decorators.test.ts +++ b/packages/typespec-client-generator-core/test/decorators.test.ts @@ -3873,6 +3873,53 @@ describe("typespec-client-generator-core: decorators", () => { strictEqual(blobNameOpParam.name, "blobName"); strictEqual(blobNameOpParam.correspondingMethodParams.length, 1); strictEqual(blobNameOpParam.correspondingMethodParams[0], blobName); + strictEqual(blobNameOpParam.onClient, true); + }); + + it("On Interface", async () => { + await runner.compileWithBuiltInService( + ` + model clientInitModel + { + p1: string; + } + + @route("/bump") + @clientInitialization(clientInitModel) + interface bumpParameter { + @route("/op1") + @doc("bump parameter") + @post + @convenientAPI(true) + op op1(@path p1: string, @query q1: string): void; + + @route("/op2") + @doc("bump parameter") + @post + @convenientAPI(true) + op op2(@path p1: string): void; + } + ` + ); + const sdkPackage = runner.context.sdkPackage; + const clientAccessor = sdkPackage.clients[0].methods[0]; + strictEqual(clientAccessor.kind, "clientaccessor"); + const bumpParameterClient = clientAccessor.response; + + const methods = bumpParameterClient.methods; + strictEqual(methods.length, 2); + + const op1Method = methods.find((x) => x.name === "op1"); + ok(op1Method); + strictEqual(op1Method.kind, "basic"); + strictEqual(op1Method.parameters.length, 1); + strictEqual(op1Method.parameters[0].name, "q1"); + const op1Op = op1Method.operation; + strictEqual(op1Op.parameters.length, 2); + strictEqual(op1Op.parameters[0].name, "p1"); + strictEqual(op1Op.parameters[0].onClient, true); + strictEqual(op1Op.parameters[1].name, "q1"); + strictEqual(op1Op.parameters[1].onClient, false); }); it("subclient", async () => { await runner.compileWithCustomization( @@ -3956,6 +4003,7 @@ describe("typespec-client-generator-core: decorators", () => { strictEqual(blobNameOpParam.name, "blobName"); strictEqual(blobNameOpParam.correspondingMethodParams.length, 1); strictEqual(blobNameOpParam.correspondingMethodParams[0], blobClientBlobInitializationProp); + strictEqual(blobNameOpParam.onClient, true); }); it("some methods don't have client initialization params", async () => { await runner.compileWithCustomization( @@ -4004,6 +4052,7 @@ describe("typespec-client-generator-core: decorators", () => { strictEqual(blobNameOpParam.name, "blobName"); strictEqual(blobNameOpParam.correspondingMethodParams.length, 1); strictEqual(blobNameOpParam.correspondingMethodParams[0], blobName); + strictEqual(blobNameOpParam.onClient, true); const noClientParamsMethod = methods[1]; strictEqual(noClientParamsMethod.name, "noClientParams"); @@ -4131,6 +4180,8 @@ describe("typespec-client-generator-core: decorators", () => { strictEqual(op.parameters.length, 2); strictEqual(op.parameters[0].correspondingMethodParams[0], blobName); strictEqual(op.parameters[1].correspondingMethodParams[0], containerName); + strictEqual(op.parameters[0].onClient, true); + strictEqual(op.parameters[1].onClient, true); }); it("redefine client structure", async () => {