From 32a118dbf66dcbd3e35fa07b54de6eeef3aad073 Mon Sep 17 00:00:00 2001 From: Christopher Radek <14189820+chrisradek@users.noreply.github.com> Date: Wed, 11 Sep 2024 15:50:14 -0700 Subject: [PATCH] Fixes versioning when using versioned named union variants (#4408) Example of bug: [playground](https://typespec.io/playground?c=aW1wb3J0ICJAdHlwZXNwZWMvaHR0cCI7CtIZcmVzdNUZdmVyc2lvbmluZyI7Cgp1c2luZyBUeXBlU3BlYy5WyR070BtIdHRw0RVSZXN0OwoKQMdVZWQox0JzKQpAc2VydmljZSh7CiAgdGl0bGU6ICJXaWRnZXQgU8YbIiwKfSkKbmFtZXNwYWNlIERlbW%2FHGzsKCmVudW0gyFAgxEZ2MSzEBjIsCn0KCnVuaW9uIEZvb0NvbnRlbnTFInN0cmluZywKCiAgQGFkZOsAkS52MikKIMQwOsQFW13FRdQlbW9kZWzEJMVS5AE5OsdYO9UzMcgzQ2hhdFJlcXVlc%2BYAjWPmAJnFcOcApTsKICDkAPA%2FzVNhbGlhcyBPdGhlclXlANY9xx4gfMQ8W107Cg%3D%3D&e=%40typespec%2Fopenapi3&options=%7B%7D) --------- Co-authored-by: Christopher Radek --- ...med-union-versioning-2024-8-11-15-19-14.md | 7 ++++++ packages/versioning/src/validate.ts | 6 +++-- packages/versioning/test/versioning.test.ts | 25 +++++++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 .chronus/changes/fix-named-union-versioning-2024-8-11-15-19-14.md diff --git a/.chronus/changes/fix-named-union-versioning-2024-8-11-15-19-14.md b/.chronus/changes/fix-named-union-versioning-2024-8-11-15-19-14.md new file mode 100644 index 000000000..ee8e74294 --- /dev/null +++ b/.chronus/changes/fix-named-union-versioning-2024-8-11-15-19-14.md @@ -0,0 +1,7 @@ +--- +changeKind: fix +packages: + - "@typespec/versioning" +--- + +Fixes versioning when using versioned named union variants diff --git a/packages/versioning/src/validate.ts b/packages/versioning/src/validate.ts index 7114b1353..a93713ad6 100644 --- a/packages/versioning/src/validate.ts +++ b/packages/versioning/src/validate.ts @@ -533,8 +533,10 @@ function validateReference(program: Program, source: Type | Type[], target: Type switch (target.kind) { case "Union": - for (const variant of target.variants.values()) { - validateReference(program, source, variant.type); + if (typeof target.name !== "string") { + for (const variant of target.variants.values()) { + validateReference(program, source, variant.type); + } } break; case "Tuple": diff --git a/packages/versioning/test/versioning.test.ts b/packages/versioning/test/versioning.test.ts index 3cb09f7eb..fffcb7e53 100644 --- a/packages/versioning/test/versioning.test.ts +++ b/packages/versioning/test/versioning.test.ts @@ -680,6 +680,31 @@ describe("versioning: logic", () => { strictEqual((v6 as any as IntrinsicType).name, "never"); }); + it("does not emit diagnostic when using named versioned union variant in incompatible versioned source", async () => { + const diagnostics = await runner.diagnose(` + @versioned(Versions) + namespace TestService { + enum Versions {v1, v2} + + @added(Versions.v2) + model Versioned {} + + union NamedUnion { + string; + + @added(Versions.v2) + Versioned; + } + + @added(Versions.v1) + model Foo { + content: NamedUnion; + } + } + `); + expectDiagnosticEmpty(diagnostics); + }); + async function versionedUnion(versions: string[], union: string) { const { Test } = (await runner.compile(` @versioned(Versions)