diff --git a/.chronus/changes/add-name-and-namespace-to-array-2024-5-13-1-59-45.md b/.chronus/changes/add-name-and-namespace-to-array-2024-5-13-1-59-45.md new file mode 100644 index 0000000000..4ae3dc76d1 --- /dev/null +++ b/.chronus/changes/add-name-and-namespace-to-array-2024-5-13-1-59-45.md @@ -0,0 +1,8 @@ +--- +# Change versionKind to one of: internal, fix, dependencies, feature, deprecation, breaking +changeKind: feature +packages: + - "@azure-tools/typespec-client-generator-core" +--- + +Add `name` and `tspNamespace` to `SdkArrayType` diff --git a/packages/typespec-client-generator-core/src/interfaces.ts b/packages/typespec-client-generator-core/src/interfaces.ts index 0810f32b26..d0e015161f 100644 --- a/packages/typespec-client-generator-core/src/interfaces.ts +++ b/packages/typespec-client-generator-core/src/interfaces.ts @@ -225,6 +225,8 @@ export interface SdkDurationType extends SdkTypeBase { export interface SdkArrayType extends SdkTypeBase { kind: "array"; + name: string; + tspNamespace?: string; valueType: SdkType; } diff --git a/packages/typespec-client-generator-core/src/types.ts b/packages/typespec-client-generator-core/src/types.ts index 18f9e7617f..76489d382e 100644 --- a/packages/typespec-client-generator-core/src/types.ts +++ b/packages/typespec-client-generator-core/src/types.ts @@ -292,13 +292,15 @@ export function getSdkArrayOrDictWithDiagnostics( keyType: diagnostics.pipe( getClientTypeWithDiagnostics(context, type.indexer.key, operation) ), - valueType, + valueType: valueType, }); } else if (name === "integer") { // only array's index key name is integer return diagnostics.wrap({ ...getSdkTypeBaseHelper(context, type, "array"), - valueType, + name: getLibraryName(context, type), + tspNamespace: getNamespaceHelper(type.namespace), + valueType: valueType, }); } } diff --git a/packages/typespec-client-generator-core/test/types/array-types.test.ts b/packages/typespec-client-generator-core/test/types/array-types.test.ts index 34461e903e..87f5efc9db 100644 --- a/packages/typespec-client-generator-core/test/types/array-types.test.ts +++ b/packages/typespec-client-generator-core/test/types/array-types.test.ts @@ -1,3 +1,4 @@ +import { AzureCoreTestLibrary } from "@azure-tools/typespec-azure-core/testing"; import { ok, strictEqual } from "assert"; import { beforeEach, describe, it } from "vitest"; import { SdkTestRunner, createSdkTestRunner } from "../test-host.js"; @@ -11,16 +12,16 @@ describe("typespec-client-generator-core: array types", () => { it("use model is to represent array", async () => { await runner.compile(` - @service({}) - namespace TestClient { - model TestModel { - prop: string; - } - model TestArray is TestModel[]; - - op get(): TestArray; + @service({}) + namespace TestClient { + model TestModel { + prop: string; } - `); + model TestArray is TestModel[]; + + op get(): TestArray; + } + `); const models = runner.context.experimental_sdkPackage.models; strictEqual(models.length, 1); const model = models[0]; @@ -32,7 +33,65 @@ describe("typespec-client-generator-core: array types", () => { ok(method); strictEqual(method.response.kind, "method"); strictEqual(method.response.type?.kind, "array"); + strictEqual(method.response.type?.name, "TestArray"); + strictEqual(method.response.type?.tspNamespace, "TestClient"); strictEqual(method.response.type?.valueType.kind, "model"); strictEqual(method.response.type?.valueType.name, "TestModel"); }); + + it("EmbeddingVector from azure-core", async () => { + const runnerWithCore = await createSdkTestRunner({ + librariesToAdd: [AzureCoreTestLibrary], + autoUsings: ["Azure.Core"], + "filter-out-core-models": false, + emitterName: "@azure-tools/typespec-java", + }); + await runnerWithCore.compileWithBuiltInAzureCoreService(` + @service({}) + namespace TestClient { + model ModelWithEmbeddingVector { + prop: EmbeddingVector; + } + + op get(): ModelWithEmbeddingVector; + } + `); + const models = runnerWithCore.context.experimental_sdkPackage.models; + strictEqual(models.length, 1); + const model = models[0]; + const property = model.properties[0]; + strictEqual(property.type.kind, "array"); + strictEqual(property.type.name, "EmbeddingVector"); + strictEqual(property.type.tspNamespace, "Azure.Core"); + strictEqual(property.type.valueType.kind, "int32"); + }); + + it("alias of EmbeddingVector", async () => { + const runnerWithCore = await createSdkTestRunner({ + librariesToAdd: [AzureCoreTestLibrary], + autoUsings: ["Azure.Core"], + "filter-out-core-models": false, + emitterName: "@azure-tools/typespec-java", + }); + await runnerWithCore.compileWithBuiltInAzureCoreService(` + @service({}) + namespace TestClient { + alias MyEmbeddingVector = EmbeddingVector; + + model ModelWithEmbeddingVector { + prop: MyEmbeddingVector; + } + + op get(): ModelWithEmbeddingVector; + } + `); + const models = runnerWithCore.context.experimental_sdkPackage.models; + strictEqual(models.length, 1); + const model = models[0]; + const property = model.properties[0]; + strictEqual(property.type.kind, "array"); + strictEqual(property.type.name, "EmbeddingVector"); + strictEqual(property.type.tspNamespace, "Azure.Core"); + strictEqual(property.type.valueType.kind, "int32"); + }); });