From 488d0eebd0556fcc6e5f4cfc69c2ef7e5c2708ed Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Tue, 30 Aug 2022 09:03:02 -0700 Subject: [PATCH] Retain name and propertyName in declaration emit copies of binding patterns if property name is a keyword (#50537) * Retain name and propertyName in declaration emit copies of binding patterns if property name is a keyword * Accept baselines * Remove out of date file --- src/compiler/checker.ts | 2 +- ...ationEmitBindingPatternWithReservedWord.js | 48 ++++++++++++ ...EmitBindingPatternWithReservedWord.symbols | 78 +++++++++++++++++++ ...onEmitBindingPatternWithReservedWord.types | 52 +++++++++++++ .../destructuringParameterDeclaration6.types | 12 +-- ...eticDefaultExportsWithDynamicImports.types | 2 +- ...ationEmitBindingPatternWithReservedWord.ts | 23 ++++++ 7 files changed, 209 insertions(+), 8 deletions(-) create mode 100644 tests/baselines/reference/declarationEmitBindingPatternWithReservedWord.js create mode 100644 tests/baselines/reference/declarationEmitBindingPatternWithReservedWord.symbols create mode 100644 tests/baselines/reference/declarationEmitBindingPatternWithReservedWord.types create mode 100644 tests/cases/compiler/declarationEmitBindingPatternWithReservedWord.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 01fc87bae36a4..e911d7fe7d2a3 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -6122,7 +6122,7 @@ namespace ts { } let visited = visitEachChild(node, elideInitializerAndPropertyRenamingAndSetEmitFlags, nullTransformationContext, /*nodesVisitor*/ undefined, elideInitializerAndPropertyRenamingAndSetEmitFlags)!; if (isBindingElement(visited)) { - if (visited.propertyName && isIdentifier(visited.propertyName) && isIdentifier(visited.name)) { + if (visited.propertyName && isIdentifier(visited.propertyName) && isIdentifier(visited.name) && !isStringAKeyword(idText(visited.propertyName))) { visited = factory.updateBindingElement( visited, visited.dotDotDotToken, diff --git a/tests/baselines/reference/declarationEmitBindingPatternWithReservedWord.js b/tests/baselines/reference/declarationEmitBindingPatternWithReservedWord.js new file mode 100644 index 0000000000000..efde38e3c6613 --- /dev/null +++ b/tests/baselines/reference/declarationEmitBindingPatternWithReservedWord.js @@ -0,0 +1,48 @@ +//// [declarationEmitBindingPatternWithReservedWord.ts] +type LocaleData = Record +type ConvertLocaleConfig = Record< + string, + T +>; +type LocaleConfig = Record>; + +export interface GetLocalesOptions { + app: unknown; + default: ConvertLocaleConfig; + config?: LocaleConfig | undefined; + name?: string; +} + +export const getLocales = ({ + app, + name, + default: defaultLocalesConfig, + config: userLocalesConfig = {}, +}: GetLocalesOptions): ConvertLocaleConfig => { + return defaultLocalesConfig; +}; + + +//// [declarationEmitBindingPatternWithReservedWord.js] +"use strict"; +exports.__esModule = true; +exports.getLocales = void 0; +var getLocales = function (_a) { + var app = _a.app, name = _a.name, defaultLocalesConfig = _a["default"], _b = _a.config, userLocalesConfig = _b === void 0 ? {} : _b; + return defaultLocalesConfig; +}; +exports.getLocales = getLocales; + + +//// [declarationEmitBindingPatternWithReservedWord.d.ts] +type LocaleData = Record; +type ConvertLocaleConfig = Record; +type LocaleConfig = Record>; +export interface GetLocalesOptions { + app: unknown; + default: ConvertLocaleConfig; + config?: LocaleConfig | undefined; + name?: string; +} +export declare const getLocales: ({ app, name, default: defaultLocalesConfig, config, }: GetLocalesOptions) => ConvertLocaleConfig; +export {}; diff --git a/tests/baselines/reference/declarationEmitBindingPatternWithReservedWord.symbols b/tests/baselines/reference/declarationEmitBindingPatternWithReservedWord.symbols new file mode 100644 index 0000000000000..fd535c190dbc1 --- /dev/null +++ b/tests/baselines/reference/declarationEmitBindingPatternWithReservedWord.symbols @@ -0,0 +1,78 @@ +=== tests/cases/compiler/declarationEmitBindingPatternWithReservedWord.ts === +type LocaleData = Record +>LocaleData : Symbol(LocaleData, Decl(declarationEmitBindingPatternWithReservedWord.ts, 0, 0)) +>Record : Symbol(Record, Decl(lib.es5.d.ts, --, --)) + +type ConvertLocaleConfig = Record< +>ConvertLocaleConfig : Symbol(ConvertLocaleConfig, Decl(declarationEmitBindingPatternWithReservedWord.ts, 0, 39)) +>T : Symbol(T, Decl(declarationEmitBindingPatternWithReservedWord.ts, 1, 25)) +>LocaleData : Symbol(LocaleData, Decl(declarationEmitBindingPatternWithReservedWord.ts, 0, 0)) +>LocaleData : Symbol(LocaleData, Decl(declarationEmitBindingPatternWithReservedWord.ts, 0, 0)) +>Record : Symbol(Record, Decl(lib.es5.d.ts, --, --)) + + string, + T +>T : Symbol(T, Decl(declarationEmitBindingPatternWithReservedWord.ts, 1, 25)) + +>; +type LocaleConfig = Record>; +>LocaleConfig : Symbol(LocaleConfig, Decl(declarationEmitBindingPatternWithReservedWord.ts, 4, 2)) +>T : Symbol(T, Decl(declarationEmitBindingPatternWithReservedWord.ts, 5, 18)) +>LocaleData : Symbol(LocaleData, Decl(declarationEmitBindingPatternWithReservedWord.ts, 0, 0)) +>LocaleData : Symbol(LocaleData, Decl(declarationEmitBindingPatternWithReservedWord.ts, 0, 0)) +>Record : Symbol(Record, Decl(lib.es5.d.ts, --, --)) +>Partial : Symbol(Partial, Decl(lib.es5.d.ts, --, --)) +>T : Symbol(T, Decl(declarationEmitBindingPatternWithReservedWord.ts, 5, 18)) + +export interface GetLocalesOptions { +>GetLocalesOptions : Symbol(GetLocalesOptions, Decl(declarationEmitBindingPatternWithReservedWord.ts, 5, 82)) +>T : Symbol(T, Decl(declarationEmitBindingPatternWithReservedWord.ts, 7, 35)) +>LocaleData : Symbol(LocaleData, Decl(declarationEmitBindingPatternWithReservedWord.ts, 0, 0)) + + app: unknown; +>app : Symbol(GetLocalesOptions.app, Decl(declarationEmitBindingPatternWithReservedWord.ts, 7, 58)) + + default: ConvertLocaleConfig; +>default : Symbol(GetLocalesOptions.default, Decl(declarationEmitBindingPatternWithReservedWord.ts, 8, 17)) +>ConvertLocaleConfig : Symbol(ConvertLocaleConfig, Decl(declarationEmitBindingPatternWithReservedWord.ts, 0, 39)) +>T : Symbol(T, Decl(declarationEmitBindingPatternWithReservedWord.ts, 7, 35)) + + config?: LocaleConfig | undefined; +>config : Symbol(GetLocalesOptions.config, Decl(declarationEmitBindingPatternWithReservedWord.ts, 9, 36)) +>LocaleConfig : Symbol(LocaleConfig, Decl(declarationEmitBindingPatternWithReservedWord.ts, 4, 2)) +>T : Symbol(T, Decl(declarationEmitBindingPatternWithReservedWord.ts, 7, 35)) + + name?: string; +>name : Symbol(GetLocalesOptions.name, Decl(declarationEmitBindingPatternWithReservedWord.ts, 10, 41)) +} + +export const getLocales = ({ +>getLocales : Symbol(getLocales, Decl(declarationEmitBindingPatternWithReservedWord.ts, 14, 12)) +>T : Symbol(T, Decl(declarationEmitBindingPatternWithReservedWord.ts, 14, 27)) +>LocaleData : Symbol(LocaleData, Decl(declarationEmitBindingPatternWithReservedWord.ts, 0, 0)) + + app, +>app : Symbol(app, Decl(declarationEmitBindingPatternWithReservedWord.ts, 14, 50)) + + name, +>name : Symbol(name, Decl(declarationEmitBindingPatternWithReservedWord.ts, 15, 8)) + + default: defaultLocalesConfig, +>default : Symbol(GetLocalesOptions.default, Decl(declarationEmitBindingPatternWithReservedWord.ts, 8, 17)) +>defaultLocalesConfig : Symbol(defaultLocalesConfig, Decl(declarationEmitBindingPatternWithReservedWord.ts, 16, 9)) + + config: userLocalesConfig = {}, +>config : Symbol(GetLocalesOptions.config, Decl(declarationEmitBindingPatternWithReservedWord.ts, 9, 36)) +>userLocalesConfig : Symbol(userLocalesConfig, Decl(declarationEmitBindingPatternWithReservedWord.ts, 17, 34)) + +}: GetLocalesOptions): ConvertLocaleConfig => { +>GetLocalesOptions : Symbol(GetLocalesOptions, Decl(declarationEmitBindingPatternWithReservedWord.ts, 5, 82)) +>T : Symbol(T, Decl(declarationEmitBindingPatternWithReservedWord.ts, 14, 27)) +>ConvertLocaleConfig : Symbol(ConvertLocaleConfig, Decl(declarationEmitBindingPatternWithReservedWord.ts, 0, 39)) +>T : Symbol(T, Decl(declarationEmitBindingPatternWithReservedWord.ts, 14, 27)) + + return defaultLocalesConfig; +>defaultLocalesConfig : Symbol(defaultLocalesConfig, Decl(declarationEmitBindingPatternWithReservedWord.ts, 16, 9)) + +}; + diff --git a/tests/baselines/reference/declarationEmitBindingPatternWithReservedWord.types b/tests/baselines/reference/declarationEmitBindingPatternWithReservedWord.types new file mode 100644 index 0000000000000..018026387e230 --- /dev/null +++ b/tests/baselines/reference/declarationEmitBindingPatternWithReservedWord.types @@ -0,0 +1,52 @@ +=== tests/cases/compiler/declarationEmitBindingPatternWithReservedWord.ts === +type LocaleData = Record +>LocaleData : { [x: string]: never; } + +type ConvertLocaleConfig = Record< +>ConvertLocaleConfig : ConvertLocaleConfig + + string, + T +>; +type LocaleConfig = Record>; +>LocaleConfig : LocaleConfig + +export interface GetLocalesOptions { + app: unknown; +>app : unknown + + default: ConvertLocaleConfig; +>default : ConvertLocaleConfig + + config?: LocaleConfig | undefined; +>config : LocaleConfig + + name?: string; +>name : string +} + +export const getLocales = ({ +>getLocales : ({ app, name, default: defaultLocalesConfig, config, }: GetLocalesOptions) => ConvertLocaleConfig +>({ app, name, default: defaultLocalesConfig, config: userLocalesConfig = {},}: GetLocalesOptions): ConvertLocaleConfig => { return defaultLocalesConfig;} : ({ app, name, default: defaultLocalesConfig, config, }: GetLocalesOptions) => ConvertLocaleConfig + + app, +>app : unknown + + name, +>name : string + + default: defaultLocalesConfig, +>default : any +>defaultLocalesConfig : ConvertLocaleConfig + + config: userLocalesConfig = {}, +>config : any +>userLocalesConfig : LocaleConfig +>{} : {} + +}: GetLocalesOptions): ConvertLocaleConfig => { + return defaultLocalesConfig; +>defaultLocalesConfig : ConvertLocaleConfig + +}; + diff --git a/tests/baselines/reference/destructuringParameterDeclaration6.types b/tests/baselines/reference/destructuringParameterDeclaration6.types index 6b5085d21219c..d135f9cb8fdbf 100644 --- a/tests/baselines/reference/destructuringParameterDeclaration6.types +++ b/tests/baselines/reference/destructuringParameterDeclaration6.types @@ -7,7 +7,7 @@ // Error function a({while}) { } ->a : ({ while }: { while: any; }) => void +>a : ({ while: }: { while: any; }) => void >while : any > : any @@ -42,32 +42,32 @@ function a7(...a: string) { } a({ while: 1 }); >a({ while: 1 }) : void ->a : ({ while }: { while: any; }) => void +>a : ({ while: }: { while: any; }) => void >{ while: 1 } : { while: number; } >while : number >1 : 1 // No Error function b1({public: x}) { } ->b1 : ({ public }: { public: any; }) => void +>b1 : ({ public: x }: { public: any; }) => void >public : any >x : any function b2({while: y}) { } ->b2 : ({ while }: { while: any; }) => void +>b2 : ({ while: y }: { while: any; }) => void >while : any >y : any b1({ public: 1 }); >b1({ public: 1 }) : void ->b1 : ({ public }: { public: any; }) => void +>b1 : ({ public: x }: { public: any; }) => void >{ public: 1 } : { public: number; } >public : number >1 : 1 b2({ while: 1 }); >b2({ while: 1 }) : void ->b2 : ({ while }: { while: any; }) => void +>b2 : ({ while: y }: { while: any; }) => void >{ while: 1 } : { while: number; } >while : number >1 : 1 diff --git a/tests/baselines/reference/syntheticDefaultExportsWithDynamicImports.types b/tests/baselines/reference/syntheticDefaultExportsWithDynamicImports.types index 3dc640792e075..3f1ef83a0ae9c 100644 --- a/tests/baselines/reference/syntheticDefaultExportsWithDynamicImports.types +++ b/tests/baselines/reference/syntheticDefaultExportsWithDynamicImports.types @@ -13,7 +13,7 @@ import("package").then(({default: foo}) => foo(42)); >import("package") : Promise<{ default: (x: number) => string; }> >"package" : "package" >then : string; }, TResult2 = never>(onfulfilled?: (value: { default: (x: number) => string; }) => TResult1 | PromiseLike, onrejected?: (reason: any) => TResult2 | PromiseLike) => Promise ->({default: foo}) => foo(42) : ({ default }: { default: (x: number) => string; }) => string +>({default: foo}) => foo(42) : ({ default: foo }: { default: (x: number) => string; }) => string >default : any >foo : (x: number) => string >foo(42) : string diff --git a/tests/cases/compiler/declarationEmitBindingPatternWithReservedWord.ts b/tests/cases/compiler/declarationEmitBindingPatternWithReservedWord.ts new file mode 100644 index 0000000000000..be6fdc13ea0e8 --- /dev/null +++ b/tests/cases/compiler/declarationEmitBindingPatternWithReservedWord.ts @@ -0,0 +1,23 @@ +// @declaration: true +type LocaleData = Record +type ConvertLocaleConfig = Record< + string, + T +>; +type LocaleConfig = Record>; + +export interface GetLocalesOptions { + app: unknown; + default: ConvertLocaleConfig; + config?: LocaleConfig | undefined; + name?: string; +} + +export const getLocales = ({ + app, + name, + default: defaultLocalesConfig, + config: userLocalesConfig = {}, +}: GetLocalesOptions): ConvertLocaleConfig => { + return defaultLocalesConfig; +};