diff --git a/.chronus/changes/fix-x-ms-identifier-inheritance-2024-8-13-21-41-26.md b/.chronus/changes/fix-x-ms-identifier-inheritance-2024-8-13-21-41-26.md new file mode 100644 index 0000000000..9e37ed0779 --- /dev/null +++ b/.chronus/changes/fix-x-ms-identifier-inheritance-2024-8-13-21-41-26.md @@ -0,0 +1,8 @@ +--- +# Change versionKind to one of: internal, fix, dependencies, feature, deprecation, breaking +changeKind: fix +packages: + - "@azure-tools/typespec-azure-resource-manager" +--- + +Fix missing-x-ms-identifier rule not checking base class for properties 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 28d2149484..6784ff0ef6 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 @@ -60,7 +60,7 @@ export const missingXmsIdentifiersRule = createRule({ if (Array.isArray(xmsIdentifiers)) { for (const prop of xmsIdentifiers) { if (typeof prop === "string") { - if (!elementType.properties.has(prop)) { + if (getProperty(elementType, prop) === undefined) { context.reportDiagnostic({ messageId: "missingProperty", format: { propertyName: prop, targetModelName: elementType.name }, 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 3c669ba834..d0bbe77c26 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 @@ -95,6 +95,26 @@ describe("typespec-azure-core: no-enum rule", () => { ) .toBeValid(); }); + + it(`doesn't emit diagnostic if x-ms-identifiers property is defined in a base class`, async () => { + await tester + .expect( + ` + model Foo { + @OpenAPI.extension("x-ms-identifiers", ["name"]) + bar: Child[]; + } + + model Child extends Base { + other: string; + } + + model Base { name: string;} + `, + ) + .toBeValid(); + }); + it(`doesn't emit diagnostic if element is a primitive type`, async () => { await tester .expect(