From afea1105c3e3d27ed6a89606a1cd1e2adf059784 Mon Sep 17 00:00:00 2001 From: Kanchalai Tanglertsampan Date: Wed, 9 Nov 2016 15:30:15 -0800 Subject: [PATCH 1/2] Do not emit "use strict" when targeting es6 or higher or module kind is es2015 and the file is external module --- src/compiler/transformers/ts.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/compiler/transformers/ts.ts b/src/compiler/transformers/ts.ts index 925869da3857f..b7d13af273300 100644 --- a/src/compiler/transformers/ts.ts +++ b/src/compiler/transformers/ts.ts @@ -457,7 +457,11 @@ namespace ts { currentSourceFile = node; // ensure "use strict" is emitted in all scenarios in alwaysStrict mode - if (compilerOptions.alwaysStrict) { + // There is no need to emit "use strict" in the following cases: + // 1. The file is an external module and target is es2015 or higher + // or 2. The file is an external module and module-kind is es6 or es2015 as such value is not allowed when targeting es5 or lower + if (compilerOptions.alwaysStrict && + !(isExternalModule(node) && (compilerOptions.target >= ScriptTarget.ES2015 || compilerOptions.module === ModuleKind.ES2015))) { node = ensureUseStrict(node); } From d629bd636d1b062a2961a4771996998d94b66186 Mon Sep 17 00:00:00 2001 From: Kanchalai Tanglertsampan Date: Wed, 9 Nov 2016 15:30:34 -0800 Subject: [PATCH 2/2] Add tests and baselines --- tests/baselines/reference/alwaysStrictModule3.js | 8 ++++++++ tests/baselines/reference/alwaysStrictModule3.symbols | 6 ++++++ tests/baselines/reference/alwaysStrictModule3.types | 7 +++++++ tests/baselines/reference/alwaysStrictModule4.js | 9 +++++++++ tests/baselines/reference/alwaysStrictModule4.symbols | 6 ++++++ tests/baselines/reference/alwaysStrictModule4.types | 7 +++++++ tests/baselines/reference/alwaysStrictModule5.js | 8 ++++++++ tests/baselines/reference/alwaysStrictModule5.symbols | 6 ++++++ tests/baselines/reference/alwaysStrictModule5.types | 7 +++++++ tests/baselines/reference/alwaysStrictModule6.js | 9 +++++++++ tests/baselines/reference/alwaysStrictModule6.symbols | 6 ++++++ tests/baselines/reference/alwaysStrictModule6.types | 7 +++++++ tests/cases/compiler/alwaysStrictModule3.ts | 5 +++++ tests/cases/compiler/alwaysStrictModule4.ts | 5 +++++ tests/cases/compiler/alwaysStrictModule5.ts | 5 +++++ tests/cases/compiler/alwaysStrictModule6.ts | 5 +++++ 16 files changed, 106 insertions(+) create mode 100644 tests/baselines/reference/alwaysStrictModule3.js create mode 100644 tests/baselines/reference/alwaysStrictModule3.symbols create mode 100644 tests/baselines/reference/alwaysStrictModule3.types create mode 100644 tests/baselines/reference/alwaysStrictModule4.js create mode 100644 tests/baselines/reference/alwaysStrictModule4.symbols create mode 100644 tests/baselines/reference/alwaysStrictModule4.types create mode 100644 tests/baselines/reference/alwaysStrictModule5.js create mode 100644 tests/baselines/reference/alwaysStrictModule5.symbols create mode 100644 tests/baselines/reference/alwaysStrictModule5.types create mode 100644 tests/baselines/reference/alwaysStrictModule6.js create mode 100644 tests/baselines/reference/alwaysStrictModule6.symbols create mode 100644 tests/baselines/reference/alwaysStrictModule6.types create mode 100644 tests/cases/compiler/alwaysStrictModule3.ts create mode 100644 tests/cases/compiler/alwaysStrictModule4.ts create mode 100644 tests/cases/compiler/alwaysStrictModule5.ts create mode 100644 tests/cases/compiler/alwaysStrictModule6.ts diff --git a/tests/baselines/reference/alwaysStrictModule3.js b/tests/baselines/reference/alwaysStrictModule3.js new file mode 100644 index 0000000000000..894bad25143d9 --- /dev/null +++ b/tests/baselines/reference/alwaysStrictModule3.js @@ -0,0 +1,8 @@ +//// [alwaysStrictModule3.ts] + +// module ES2015 +export const a = 1; + +//// [alwaysStrictModule3.js] +// module ES2015 +export var a = 1; diff --git a/tests/baselines/reference/alwaysStrictModule3.symbols b/tests/baselines/reference/alwaysStrictModule3.symbols new file mode 100644 index 0000000000000..6f053673f0e40 --- /dev/null +++ b/tests/baselines/reference/alwaysStrictModule3.symbols @@ -0,0 +1,6 @@ +=== tests/cases/compiler/alwaysStrictModule3.ts === + +// module ES2015 +export const a = 1; +>a : Symbol(a, Decl(alwaysStrictModule3.ts, 2, 12)) + diff --git a/tests/baselines/reference/alwaysStrictModule3.types b/tests/baselines/reference/alwaysStrictModule3.types new file mode 100644 index 0000000000000..75b11206a4f7a --- /dev/null +++ b/tests/baselines/reference/alwaysStrictModule3.types @@ -0,0 +1,7 @@ +=== tests/cases/compiler/alwaysStrictModule3.ts === + +// module ES2015 +export const a = 1; +>a : 1 +>1 : 1 + diff --git a/tests/baselines/reference/alwaysStrictModule4.js b/tests/baselines/reference/alwaysStrictModule4.js new file mode 100644 index 0000000000000..1444f351bbd43 --- /dev/null +++ b/tests/baselines/reference/alwaysStrictModule4.js @@ -0,0 +1,9 @@ +//// [alwaysStrictModule4.ts] + +// Module commonjs +export const a = 1 + +//// [alwaysStrictModule4.js] +"use strict"; +// Module commonjs +exports.a = 1; diff --git a/tests/baselines/reference/alwaysStrictModule4.symbols b/tests/baselines/reference/alwaysStrictModule4.symbols new file mode 100644 index 0000000000000..4b8a968ae165d --- /dev/null +++ b/tests/baselines/reference/alwaysStrictModule4.symbols @@ -0,0 +1,6 @@ +=== tests/cases/compiler/alwaysStrictModule4.ts === + +// Module commonjs +export const a = 1 +>a : Symbol(a, Decl(alwaysStrictModule4.ts, 2, 12)) + diff --git a/tests/baselines/reference/alwaysStrictModule4.types b/tests/baselines/reference/alwaysStrictModule4.types new file mode 100644 index 0000000000000..fff87967605c9 --- /dev/null +++ b/tests/baselines/reference/alwaysStrictModule4.types @@ -0,0 +1,7 @@ +=== tests/cases/compiler/alwaysStrictModule4.ts === + +// Module commonjs +export const a = 1 +>a : 1 +>1 : 1 + diff --git a/tests/baselines/reference/alwaysStrictModule5.js b/tests/baselines/reference/alwaysStrictModule5.js new file mode 100644 index 0000000000000..74b9d72263c4c --- /dev/null +++ b/tests/baselines/reference/alwaysStrictModule5.js @@ -0,0 +1,8 @@ +//// [alwaysStrictModule5.ts] + +// Targeting ES6 +export const a = 1; + +//// [alwaysStrictModule5.js] +// Targeting ES6 +export const a = 1; diff --git a/tests/baselines/reference/alwaysStrictModule5.symbols b/tests/baselines/reference/alwaysStrictModule5.symbols new file mode 100644 index 0000000000000..903bf3c5c9893 --- /dev/null +++ b/tests/baselines/reference/alwaysStrictModule5.symbols @@ -0,0 +1,6 @@ +=== tests/cases/compiler/alwaysStrictModule5.ts === + +// Targeting ES6 +export const a = 1; +>a : Symbol(a, Decl(alwaysStrictModule5.ts, 2, 12)) + diff --git a/tests/baselines/reference/alwaysStrictModule5.types b/tests/baselines/reference/alwaysStrictModule5.types new file mode 100644 index 0000000000000..2bfa329ad7e8d --- /dev/null +++ b/tests/baselines/reference/alwaysStrictModule5.types @@ -0,0 +1,7 @@ +=== tests/cases/compiler/alwaysStrictModule5.ts === + +// Targeting ES6 +export const a = 1; +>a : 1 +>1 : 1 + diff --git a/tests/baselines/reference/alwaysStrictModule6.js b/tests/baselines/reference/alwaysStrictModule6.js new file mode 100644 index 0000000000000..9a60392616977 --- /dev/null +++ b/tests/baselines/reference/alwaysStrictModule6.js @@ -0,0 +1,9 @@ +//// [alwaysStrictModule6.ts] + +// Targeting ES5 +export const a = 1; + +//// [alwaysStrictModule6.js] +"use strict"; +// Targeting ES5 +exports.a = 1; diff --git a/tests/baselines/reference/alwaysStrictModule6.symbols b/tests/baselines/reference/alwaysStrictModule6.symbols new file mode 100644 index 0000000000000..59a70f3e5b5fe --- /dev/null +++ b/tests/baselines/reference/alwaysStrictModule6.symbols @@ -0,0 +1,6 @@ +=== tests/cases/compiler/alwaysStrictModule6.ts === + +// Targeting ES5 +export const a = 1; +>a : Symbol(a, Decl(alwaysStrictModule6.ts, 2, 12)) + diff --git a/tests/baselines/reference/alwaysStrictModule6.types b/tests/baselines/reference/alwaysStrictModule6.types new file mode 100644 index 0000000000000..0970380911eb3 --- /dev/null +++ b/tests/baselines/reference/alwaysStrictModule6.types @@ -0,0 +1,7 @@ +=== tests/cases/compiler/alwaysStrictModule6.ts === + +// Targeting ES5 +export const a = 1; +>a : 1 +>1 : 1 + diff --git a/tests/cases/compiler/alwaysStrictModule3.ts b/tests/cases/compiler/alwaysStrictModule3.ts new file mode 100644 index 0000000000000..adb93cede3616 --- /dev/null +++ b/tests/cases/compiler/alwaysStrictModule3.ts @@ -0,0 +1,5 @@ +// @alwaysStrict: true +// @module: es2015 + +// module ES2015 +export const a = 1; \ No newline at end of file diff --git a/tests/cases/compiler/alwaysStrictModule4.ts b/tests/cases/compiler/alwaysStrictModule4.ts new file mode 100644 index 0000000000000..f731e6dd734a0 --- /dev/null +++ b/tests/cases/compiler/alwaysStrictModule4.ts @@ -0,0 +1,5 @@ +// @alwaysStrict: true +// @module: commonjs + +// Module commonjs +export const a = 1 \ No newline at end of file diff --git a/tests/cases/compiler/alwaysStrictModule5.ts b/tests/cases/compiler/alwaysStrictModule5.ts new file mode 100644 index 0000000000000..d1ac528837085 --- /dev/null +++ b/tests/cases/compiler/alwaysStrictModule5.ts @@ -0,0 +1,5 @@ +// @alwaysStrict: true +// @target: es6 + +// Targeting ES6 +export const a = 1; \ No newline at end of file diff --git a/tests/cases/compiler/alwaysStrictModule6.ts b/tests/cases/compiler/alwaysStrictModule6.ts new file mode 100644 index 0000000000000..064ece1a4e1a9 --- /dev/null +++ b/tests/cases/compiler/alwaysStrictModule6.ts @@ -0,0 +1,5 @@ +// @alwaysStrict: true +// @target: es5 + +// Targeting ES5 +export const a = 1; \ No newline at end of file