From 3872ab84f7502408f9721d76d4a72ff0fa74f648 Mon Sep 17 00:00:00 2001 From: Dapeng Zhang Date: Mon, 12 Aug 2024 17:12:31 +0800 Subject: [PATCH] initial commit --- .../src/public-utils.ts | 28 +++++++++++++++- .../test/types/model-types.test.ts | 32 +++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/packages/typespec-client-generator-core/src/public-utils.ts b/packages/typespec-client-generator-core/src/public-utils.ts index ac0bccf24f..f5c984283c 100644 --- a/packages/typespec-client-generator-core/src/public-utils.ts +++ b/packages/typespec-client-generator-core/src/public-utils.ts @@ -214,7 +214,7 @@ export function getCrossLanguageDefinitionId( operation?: Operation, appendNamespace: boolean = true ): string { - let retval = type.name || "anonymous"; + let [retval, args] = getTypeName(context, type, operation, appendNamespace); const namespace = type.kind === "ModelProperty" ? type.model?.namespace : type.namespace; switch (type.kind) { case "Union": @@ -252,9 +252,35 @@ export function getCrossLanguageDefinitionId( if (appendNamespace && namespace && getNamespaceFullName(namespace)) { retval = `${getNamespaceFullName(namespace)}.${retval}`; } + + if (args) { + retval = `${retval}<${args}>`; + } return retval; } +function getTypeName( + context: TCGCContext, + type: Union | Model | Enum | Scalar | ModelProperty | Operation | Namespace | Interface, + operation?: Operation, + appendNamespace: boolean = true +): [string, string | undefined] { + const typeName = type.name || "anonymous"; + + if ( + type.kind === "Model" || + type.kind === "Union" || + type.kind === "Scalar" || + type.kind === "Interface" || + type.kind === "Operation" + ) { + if (type.templateMapper?.args) { + } + } + + return [typeName, undefined]; +} + /** * Helper function return the cross langauge package id for a package */ diff --git a/packages/typespec-client-generator-core/test/types/model-types.test.ts b/packages/typespec-client-generator-core/test/types/model-types.test.ts index 177976849c..8600f0cadd 100644 --- a/packages/typespec-client-generator-core/test/types/model-types.test.ts +++ b/packages/typespec-client-generator-core/test/types/model-types.test.ts @@ -665,6 +665,38 @@ describe("typespec-client-generator-core: model types", () => { strictEqual(discriminatorProperty.serializedName, "@data.kind"); }); + it("crossLanguageDefinitionId should be unique for templated models", async () => { + const runnerWithCore = await createSdkTestRunner({ + librariesToAdd: [AzureCoreTestLibrary], + autoUsings: ["Azure.Core"], + emitterName: "@azure-tools/typespec-java", + }); + await runnerWithCore.compileWithBuiltInAzureCoreService(` + @access(Access.public) + @usage(Usage.input | Usage.output) + model User {}; + + @access(Access.public) + @usage(Usage.input | Usage.output) + model AnotherUser {}; + + @access(Access.public) + @usage(Usage.input | Usage.output) + model Test { + prop1: Page; + prop2: Page; + } + `); + + const models = runnerWithCore.context.sdkPackage.models; + const pagedUser = models.find((x) => x.name === "PagedUser"); + const pagedAnotherUser = models.find((x) => x.name === "PagedAnotherUser"); + ok(pagedUser); + ok(pagedAnotherUser); + strictEqual(pagedUser.crossLanguageDefinitionId, "My.Service.PagedUser"); + strictEqual(pagedAnotherUser.crossLanguageDefinitionId, "My.Service.PagedAnotherUser"); + }); + it("filterOutCoreModels true", async () => { const runnerWithCore = await createSdkTestRunner({ librariesToAdd: [AzureCoreTestLibrary],