diff --git a/.chronus/changes/tcgc-forbid-polymorphism-flatten-2024-6-23-22-12-38.md b/.chronus/changes/tcgc-forbid-polymorphism-flatten-2024-6-23-22-12-38.md new file mode 100644 index 0000000000..0ec2696c11 --- /dev/null +++ b/.chronus/changes/tcgc-forbid-polymorphism-flatten-2024-6-23-22-12-38.md @@ -0,0 +1,7 @@ +--- +changeKind: feature +packages: + - "@azure-tools/typespec-client-generator-core" +--- + +Report error diagnostic when trying to flattening a model with polymorphism \ No newline at end of file diff --git a/packages/typespec-client-generator-core/src/decorators.ts b/packages/typespec-client-generator-core/src/decorators.ts index d59ebeb36f..4b6f5b2bb1 100644 --- a/packages/typespec-client-generator-core/src/decorators.ts +++ b/packages/typespec-client-generator-core/src/decorators.ts @@ -17,6 +17,7 @@ import { Type, Union, createDiagnosticCollector, + getDiscriminator, getNamespaceFullName, getProjectedName, ignoreDiagnostics, @@ -958,6 +959,13 @@ export function $flattenProperty( target: ModelProperty, scope?: LanguageScopes ) { + if (getDiscriminator(context.program, target.type)) { + reportDiagnostic(context.program, { + code: "flatten-polymorphism", + format: {}, + target: target, + }); + } setScopedDecoratorData(context, $flattenProperty, flattenPropertyKey, target, true, scope); // eslint-disable-line deprecation/deprecation } diff --git a/packages/typespec-client-generator-core/src/lib.ts b/packages/typespec-client-generator-core/src/lib.ts index 96409970e6..a951ea8544 100644 --- a/packages/typespec-client-generator-core/src/lib.ts +++ b/packages/typespec-client-generator-core/src/lib.ts @@ -186,6 +186,12 @@ export const $lib = createTypeSpecLibrary({ default: paramMessage`Value in example file '${"relativePath"}' does not follow its definition:\n${"value"}`, }, }, + "flatten-polymorphism": { + severity: "error", + messages: { + default: `Cannot flatten property of polymorphic type.`, + }, + }, }, }); diff --git a/packages/typespec-client-generator-core/test/decorators.test.ts b/packages/typespec-client-generator-core/test/decorators.test.ts index 39066f3449..9e09587e18 100644 --- a/packages/typespec-client-generator-core/test/decorators.test.ts +++ b/packages/typespec-client-generator-core/test/decorators.test.ts @@ -2566,6 +2566,30 @@ describe("typespec-client-generator-core: decorators", () => { code: "decorator-wrong-target", }); }); + + it("throws error when used on a polymorphism type", async () => { + const diagnostics = await runner.diagnose(` + @service + @test namespace MyService { + #suppress "deprecated" "@flattenProperty decorator is not recommended to use." + @test + model Model1{ + @flattenProperty + child: Model2; + } + + @test + @discriminator("kind") + model Model2{ + kind: string; + } + } + `); + + expectDiagnostics(diagnostics, { + code: "@azure-tools/typespec-client-generator-core/flatten-polymorphism", + }); + }); }); describe("@clientName", () => {