From 980aef736126e6ccf23cb053a44981ab4540162b Mon Sep 17 00:00:00 2001 From: Alitzel Mendez Bustillo Date: Fri, 25 Oct 2024 10:43:59 -0700 Subject: [PATCH 1/2] Fix x-ms-identifiers-linter-rule --- .../src/rules/missing-x-ms-identifiers.ts | 28 +++++++++++++------ .../rules/missing-x-ms-identifiers.test.ts | 25 +++++++++++++++++ 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/packages/typespec-azure-resource-manager/src/rules/missing-x-ms-identifiers.ts b/packages/typespec-azure-resource-manager/src/rules/missing-x-ms-identifiers.ts index 6784ff0ef6..d59153eedd 100644 --- a/packages/typespec-azure-resource-manager/src/rules/missing-x-ms-identifiers.ts +++ b/packages/typespec-azure-resource-manager/src/rules/missing-x-ms-identifiers.ts @@ -58,19 +58,29 @@ export const missingXmsIdentifiersRule = createRule({ } if (Array.isArray(xmsIdentifiers)) { - for (const prop of xmsIdentifiers) { - if (typeof prop === "string") { - if (getProperty(elementType, prop) === undefined) { - context.reportDiagnostic({ - messageId: "missingProperty", - format: { propertyName: prop, targetModelName: elementType.name }, - target: property, - }); + for (const propIdentifier of xmsIdentifiers) { + if (typeof propIdentifier === "string") { + const props = propIdentifier.split("/"); + let element = elementType; + for (const prop of props) { + const propertyValue = getProperty(element, prop); + if (propertyValue === undefined) { + context.reportDiagnostic({ + messageId: "missingProperty", + format: { propertyName: prop, targetModelName: elementType.name }, + target: property, + }); + } + + const propertyType = propertyValue?.type as ArrayModelType; + if (propertyType !== undefined && propertyType.kind === "Model") { + element = propertyType; + } } } else { context.reportDiagnostic({ messageId: "notArray", - format: { valueType: typeof prop }, + format: { valueType: typeof propIdentifier }, target: property, }); } diff --git a/packages/typespec-azure-resource-manager/test/rules/missing-x-ms-identifiers.test.ts b/packages/typespec-azure-resource-manager/test/rules/missing-x-ms-identifiers.test.ts index d0bbe77c26..c3a7ff564b 100644 --- a/packages/typespec-azure-resource-manager/test/rules/missing-x-ms-identifiers.test.ts +++ b/packages/typespec-azure-resource-manager/test/rules/missing-x-ms-identifiers.test.ts @@ -130,4 +130,29 @@ describe("typespec-azure-core: no-enum rule", () => { ) .toBeValid(); }); + + it("allow array of x-ms-identifiers", async () => { + await tester + .expect( + ` + model Pet { + @OpenAPI.extension("x-ms-identifiers", ["food/brand/name"]) + pet: Dog[]; + } + + model Dog { + food: Food; + } + + model Food { + brand: Brand; + } + + model Brand { + name: string; + } + `, + ) + .toBeValid(); + }); }); From b7bbc85544035912afc58e9b2907656f98ce5a62 Mon Sep 17 00:00:00 2001 From: Alitzel Mendez Bustillo Date: Fri, 25 Oct 2024 10:51:24 -0700 Subject: [PATCH 2/2] summary of changes --- .../fix-x-ms-identifiers-rule-2024-9-25-10-44-57.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .chronus/changes/fix-x-ms-identifiers-rule-2024-9-25-10-44-57.md diff --git a/.chronus/changes/fix-x-ms-identifiers-rule-2024-9-25-10-44-57.md b/.chronus/changes/fix-x-ms-identifiers-rule-2024-9-25-10-44-57.md new file mode 100644 index 0000000000..6a7ca145ea --- /dev/null +++ b/.chronus/changes/fix-x-ms-identifiers-rule-2024-9-25-10-44-57.md @@ -0,0 +1,7 @@ +--- +changeKind: fix +packages: + - "@azure-tools/typespec-azure-resource-manager" +--- + +Fix the `x-ms-identifier` rule. The `x-ms-identifier` supports indexing into inner properties, but the linter does not support that and reports a warning.