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)