From fcf28506aa7a8b42670a25ef82d893e87e6a16b1 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Fri, 31 Jan 2020 10:41:47 -0800 Subject: [PATCH] Fix overzealous renaming of emit helpers in es module emit (#36541) --- .../transformers/module/esnextAnd2015.ts | 4 ++- ...tHelpersWithLocalCollisions(module=amd).js | 28 +++++++++++++++ ...ersWithLocalCollisions(module=commonjs).js | 26 ++++++++++++++ ...lpersWithLocalCollisions(module=es2020).js | 24 +++++++++++++ ...tHelpersWithLocalCollisions(module=es6).js | 24 +++++++++++++ ...lpersWithLocalCollisions(module=esnext).js | 24 +++++++++++++ ...HelpersWithLocalCollisions(module=none).js | 26 ++++++++++++++ ...lpersWithLocalCollisions(module=system).js | 34 ++++++++++++++++++ ...tHelpersWithLocalCollisions(module=umd).js | 36 +++++++++++++++++++ .../emitHelpersWithLocalCollisions.ts | 12 +++++++ 10 files changed, 237 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/emitHelpersWithLocalCollisions(module=amd).js create mode 100644 tests/baselines/reference/emitHelpersWithLocalCollisions(module=commonjs).js create mode 100644 tests/baselines/reference/emitHelpersWithLocalCollisions(module=es2020).js create mode 100644 tests/baselines/reference/emitHelpersWithLocalCollisions(module=es6).js create mode 100644 tests/baselines/reference/emitHelpersWithLocalCollisions(module=esnext).js create mode 100644 tests/baselines/reference/emitHelpersWithLocalCollisions(module=none).js create mode 100644 tests/baselines/reference/emitHelpersWithLocalCollisions(module=system).js create mode 100644 tests/baselines/reference/emitHelpersWithLocalCollisions(module=umd).js create mode 100644 tests/cases/compiler/emitHelpersWithLocalCollisions.ts diff --git a/src/compiler/transformers/module/esnextAnd2015.ts b/src/compiler/transformers/module/esnextAnd2015.ts index 722c0ca7708..d7329856c06 100644 --- a/src/compiler/transformers/module/esnextAnd2015.ts +++ b/src/compiler/transformers/module/esnextAnd2015.ts @@ -105,7 +105,9 @@ namespace ts { */ function onEmitNode(hint: EmitHint, node: Node, emitCallback: (hint: EmitHint, node: Node) => void): void { if (isSourceFile(node)) { - helperNameSubstitutions = createMap(); + if ((isExternalModule(node) || compilerOptions.isolatedModules) && compilerOptions.importHelpers) { + helperNameSubstitutions = createMap(); + } previousOnEmitNode(hint, node, emitCallback); helperNameSubstitutions = undefined; } diff --git a/tests/baselines/reference/emitHelpersWithLocalCollisions(module=amd).js b/tests/baselines/reference/emitHelpersWithLocalCollisions(module=amd).js new file mode 100644 index 00000000000..b0039e8d483 --- /dev/null +++ b/tests/baselines/reference/emitHelpersWithLocalCollisions(module=amd).js @@ -0,0 +1,28 @@ +//// [a.ts] +declare var dec: any, __decorate: any; +@dec export class A { +} + +const o = { a: 1 }; +const y = { ...o }; + + +//// [a.js] +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +define(["require", "exports"], function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + let A = class A { + }; + A = __decorate([ + dec + ], A); + exports.A = A; + const o = { a: 1 }; + const y = Object.assign({}, o); +}); diff --git a/tests/baselines/reference/emitHelpersWithLocalCollisions(module=commonjs).js b/tests/baselines/reference/emitHelpersWithLocalCollisions(module=commonjs).js new file mode 100644 index 00000000000..42fcc5acf61 --- /dev/null +++ b/tests/baselines/reference/emitHelpersWithLocalCollisions(module=commonjs).js @@ -0,0 +1,26 @@ +//// [a.ts] +declare var dec: any, __decorate: any; +@dec export class A { +} + +const o = { a: 1 }; +const y = { ...o }; + + +//// [a.js] +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +let A = class A { +}; +A = __decorate([ + dec +], A); +exports.A = A; +const o = { a: 1 }; +const y = Object.assign({}, o); diff --git a/tests/baselines/reference/emitHelpersWithLocalCollisions(module=es2020).js b/tests/baselines/reference/emitHelpersWithLocalCollisions(module=es2020).js new file mode 100644 index 00000000000..74b96c362b3 --- /dev/null +++ b/tests/baselines/reference/emitHelpersWithLocalCollisions(module=es2020).js @@ -0,0 +1,24 @@ +//// [a.ts] +declare var dec: any, __decorate: any; +@dec export class A { +} + +const o = { a: 1 }; +const y = { ...o }; + + +//// [a.js] +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +let A = class A { +}; +A = __decorate([ + dec +], A); +export { A }; +const o = { a: 1 }; +const y = Object.assign({}, o); diff --git a/tests/baselines/reference/emitHelpersWithLocalCollisions(module=es6).js b/tests/baselines/reference/emitHelpersWithLocalCollisions(module=es6).js new file mode 100644 index 00000000000..74b96c362b3 --- /dev/null +++ b/tests/baselines/reference/emitHelpersWithLocalCollisions(module=es6).js @@ -0,0 +1,24 @@ +//// [a.ts] +declare var dec: any, __decorate: any; +@dec export class A { +} + +const o = { a: 1 }; +const y = { ...o }; + + +//// [a.js] +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +let A = class A { +}; +A = __decorate([ + dec +], A); +export { A }; +const o = { a: 1 }; +const y = Object.assign({}, o); diff --git a/tests/baselines/reference/emitHelpersWithLocalCollisions(module=esnext).js b/tests/baselines/reference/emitHelpersWithLocalCollisions(module=esnext).js new file mode 100644 index 00000000000..74b96c362b3 --- /dev/null +++ b/tests/baselines/reference/emitHelpersWithLocalCollisions(module=esnext).js @@ -0,0 +1,24 @@ +//// [a.ts] +declare var dec: any, __decorate: any; +@dec export class A { +} + +const o = { a: 1 }; +const y = { ...o }; + + +//// [a.js] +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +let A = class A { +}; +A = __decorate([ + dec +], A); +export { A }; +const o = { a: 1 }; +const y = Object.assign({}, o); diff --git a/tests/baselines/reference/emitHelpersWithLocalCollisions(module=none).js b/tests/baselines/reference/emitHelpersWithLocalCollisions(module=none).js new file mode 100644 index 00000000000..42fcc5acf61 --- /dev/null +++ b/tests/baselines/reference/emitHelpersWithLocalCollisions(module=none).js @@ -0,0 +1,26 @@ +//// [a.ts] +declare var dec: any, __decorate: any; +@dec export class A { +} + +const o = { a: 1 }; +const y = { ...o }; + + +//// [a.js] +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +let A = class A { +}; +A = __decorate([ + dec +], A); +exports.A = A; +const o = { a: 1 }; +const y = Object.assign({}, o); diff --git a/tests/baselines/reference/emitHelpersWithLocalCollisions(module=system).js b/tests/baselines/reference/emitHelpersWithLocalCollisions(module=system).js new file mode 100644 index 00000000000..8c40955c2ca --- /dev/null +++ b/tests/baselines/reference/emitHelpersWithLocalCollisions(module=system).js @@ -0,0 +1,34 @@ +//// [a.ts] +declare var dec: any, __decorate: any; +@dec export class A { +} + +const o = { a: 1 }; +const y = { ...o }; + + +//// [a.js] +System.register([], function (exports_1, context_1) { + "use strict"; + var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + var A, o, y; + var __moduleName = context_1 && context_1.id; + return { + setters: [], + execute: function () { + A = class A { + }; + A = __decorate([ + dec + ], A); + exports_1("A", A); + o = { a: 1 }; + y = Object.assign({}, o); + } + }; +}); diff --git a/tests/baselines/reference/emitHelpersWithLocalCollisions(module=umd).js b/tests/baselines/reference/emitHelpersWithLocalCollisions(module=umd).js new file mode 100644 index 00000000000..330e5ea0acb --- /dev/null +++ b/tests/baselines/reference/emitHelpersWithLocalCollisions(module=umd).js @@ -0,0 +1,36 @@ +//// [a.ts] +declare var dec: any, __decorate: any; +@dec export class A { +} + +const o = { a: 1 }; +const y = { ...o }; + + +//// [a.js] +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +(function (factory) { + if (typeof module === "object" && typeof module.exports === "object") { + var v = factory(require, exports); + if (v !== undefined) module.exports = v; + } + else if (typeof define === "function" && define.amd) { + define(["require", "exports"], factory); + } +})(function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + let A = class A { + }; + A = __decorate([ + dec + ], A); + exports.A = A; + const o = { a: 1 }; + const y = Object.assign({}, o); +}); diff --git a/tests/cases/compiler/emitHelpersWithLocalCollisions.ts b/tests/cases/compiler/emitHelpersWithLocalCollisions.ts new file mode 100644 index 00000000000..c10e037abc9 --- /dev/null +++ b/tests/cases/compiler/emitHelpersWithLocalCollisions.ts @@ -0,0 +1,12 @@ +// @target: es6 +// @module: * +// @moduleResolution: classic +// @experimentalDecorators: true +// @filename: a.ts +// @noTypesAndSymbols: true +declare var dec: any, __decorate: any; +@dec export class A { +} + +const o = { a: 1 }; +const y = { ...o };