From 7d104581ef253380dc05a28d5f8b949369c8842f Mon Sep 17 00:00:00 2001 From: Travis Prescott Date: Wed, 18 Oct 2023 09:52:05 -0700 Subject: [PATCH] Fix issue with `@overload` in projections (#2582) Fix #2533. --- .../compiler/booleanTrueFix_2023-10-17-22-35.json | 10 ++++++++++ .../openapi3/booleanTrueFix_2023-10-17-22-35.json | 10 ++++++++++ packages/compiler/src/lib/decorators.ts | 8 ++++---- packages/openapi3/test/overloads.test.ts | 15 +++++++++++++++ 4 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 common/changes/@typespec/compiler/booleanTrueFix_2023-10-17-22-35.json create mode 100644 common/changes/@typespec/openapi3/booleanTrueFix_2023-10-17-22-35.json diff --git a/common/changes/@typespec/compiler/booleanTrueFix_2023-10-17-22-35.json b/common/changes/@typespec/compiler/booleanTrueFix_2023-10-17-22-35.json new file mode 100644 index 0000000000..b62fc76e27 --- /dev/null +++ b/common/changes/@typespec/compiler/booleanTrueFix_2023-10-17-22-35.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@typespec/compiler", + "comment": "Fix issue where using `@overload` could result in incorrect `unassignable` type errors.", + "type": "none" + } + ], + "packageName": "@typespec/compiler" +} diff --git a/common/changes/@typespec/openapi3/booleanTrueFix_2023-10-17-22-35.json b/common/changes/@typespec/openapi3/booleanTrueFix_2023-10-17-22-35.json new file mode 100644 index 0000000000..d9a70151de --- /dev/null +++ b/common/changes/@typespec/openapi3/booleanTrueFix_2023-10-17-22-35.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@typespec/openapi3", + "comment": "", + "type": "none" + } + ], + "packageName": "@typespec/openapi3" +} \ No newline at end of file diff --git a/packages/compiler/src/lib/decorators.ts b/packages/compiler/src/lib/decorators.ts index 65762720b5..88e65dd4a7 100644 --- a/packages/compiler/src/lib/decorators.ts +++ b/packages/compiler/src/lib/decorators.ts @@ -1162,15 +1162,15 @@ const overloadsOperationKey = createStateSymbol("overloadsOperation"); export function $overload(context: DecoratorContext, target: Operation, overloadBase: Operation) { // Ensure that the overloaded method arguments are a subtype of the original operation. const [paramValid, paramDiagnostics] = context.program.checker.isTypeAssignableTo( - target.parameters, - overloadBase.parameters, + target.parameters.projectionBase ?? target.parameters, + overloadBase.parameters.projectionBase ?? overloadBase.parameters, target ); if (!paramValid) context.program.reportDiagnostics(paramDiagnostics); const [returnTypeValid, returnTypeDiagnostics] = context.program.checker.isTypeAssignableTo( - target.returnType, - overloadBase.returnType, + target.returnType.projectionBase ?? target.returnType, + overloadBase.returnType.projectionBase ?? overloadBase.returnType, target ); if (!returnTypeValid) context.program.reportDiagnostics(returnTypeDiagnostics); diff --git a/packages/openapi3/test/overloads.test.ts b/packages/openapi3/test/overloads.test.ts index 102b34d336..5aaceb21c3 100644 --- a/packages/openapi3/test/overloads.test.ts +++ b/packages/openapi3/test/overloads.test.ts @@ -109,4 +109,19 @@ describe("openapi3: overloads", () => { } `); }); + + it("can overload a boolean property with true or false", async () => { + const _ = await openApiFor(` + @test + op someThing(param: boolean): string | int32; + + @test + @overload(someThing) + op someStringThing(param: true): string; + + @test + @overload(someThing) + op someNumberThing(param: false): int32; + `); + }); });