From 0d4ac0157466cc2b68d5e5392f9ea94ede20dede Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Thu, 10 Nov 2016 11:45:56 -0800 Subject: [PATCH 1/3] Report errors for import helpers missing __rest --- src/compiler/checker.ts | 6 +++++- src/compiler/types.ts | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 95faebd2875e5..e7f3558a3e62f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -19970,9 +19970,13 @@ namespace ts { if (requestedExternalEmitHelpers & NodeFlags.HasClassExtends && languageVersion < ScriptTarget.ES2015) { verifyHelperSymbol(exports, "__extends", SymbolFlags.Value); } - if (requestedExternalEmitHelpers & NodeFlags.HasSpreadAttribute && compilerOptions.jsx !== JsxEmit.Preserve) { + if (requestedExternalEmitHelpers & NodeFlags.HasSpreadAttribute && + (languageVersion < ScriptTarget.ESNext || compilerOptions.jsx === JsxEmit.React)) { verifyHelperSymbol(exports, "__assign", SymbolFlags.Value); } + if (languageVersion < ScriptTarget.ESNext && requestedExternalEmitHelpers & NodeFlags.HasRestAttribute) { + verifyHelperSymbol(exports, "__rest", SymbolFlags.Value); + } if (requestedExternalEmitHelpers & NodeFlags.HasDecorators) { verifyHelperSymbol(exports, "__decorate", SymbolFlags.Value); if (compilerOptions.emitDecoratorMetadata) { diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 9889d3ad1af25..7db19af7382fb 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -433,7 +433,7 @@ namespace ts { BlockScoped = Let | Const, ReachabilityCheckFlags = HasImplicitReturn | HasExplicitReturn, - EmitHelperFlags = HasClassExtends | HasDecorators | HasParamDecorators | HasAsyncFunctions | HasSpreadAttribute, + EmitHelperFlags = HasClassExtends | HasDecorators | HasParamDecorators | HasAsyncFunctions | HasSpreadAttribute | HasRestAttribute, ReachabilityAndEmitFlags = ReachabilityCheckFlags | EmitHelperFlags, // Parsing context flags From d6bf27d6b6bc4a74d8cd47c68f1b452171cdf3dd Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Thu, 10 Nov 2016 11:46:10 -0800 Subject: [PATCH 2/3] Correctly check spread assignments in strict mode Previously it crashed in the binder. --- src/compiler/binder.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index 197adfdb5c43b..3e65b547d5b82 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -1553,7 +1553,7 @@ namespace ts { const seen = createMap(); for (const prop of node.properties) { - if (prop.name.kind !== SyntaxKind.Identifier) { + if (prop.kind === SyntaxKind.SpreadAssignment || prop.name.kind !== SyntaxKind.Identifier) { continue; } From ba6e5a0ffad18b1852a3f3a2be6804cc95d3ae15 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Thu, 10 Nov 2016 11:47:03 -0800 Subject: [PATCH 3/3] Test error for import helpers with no __rest --- .../reference/importHelpersNoHelpers.errors.txt | 11 ++++++++++- tests/baselines/reference/importHelpersNoHelpers.js | 10 +++++++++- tests/cases/compiler/importHelpersNoHelpers.ts | 6 +++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/tests/baselines/reference/importHelpersNoHelpers.errors.txt b/tests/baselines/reference/importHelpersNoHelpers.errors.txt index ebb25dbd7c974..fa9a935c8d811 100644 --- a/tests/baselines/reference/importHelpersNoHelpers.errors.txt +++ b/tests/baselines/reference/importHelpersNoHelpers.errors.txt @@ -1,13 +1,17 @@ +error TS2305: Module 'tslib' has no exported member '__assign'. error TS2305: Module 'tslib' has no exported member '__decorate'. error TS2305: Module 'tslib' has no exported member '__extends'. error TS2305: Module 'tslib' has no exported member '__metadata'. error TS2305: Module 'tslib' has no exported member '__param'. +error TS2305: Module 'tslib' has no exported member '__rest'. +!!! error TS2305: Module 'tslib' has no exported member '__assign'. !!! error TS2305: Module 'tslib' has no exported member '__decorate'. !!! error TS2305: Module 'tslib' has no exported member '__extends'. !!! error TS2305: Module 'tslib' has no exported member '__metadata'. !!! error TS2305: Module 'tslib' has no exported member '__param'. +!!! error TS2305: Module 'tslib' has no exported member '__rest'. ==== tests/cases/compiler/external.ts (0 errors) ==== export class A { } export class B extends A { } @@ -20,6 +24,10 @@ error TS2305: Module 'tslib' has no exported member '__param'. } } + const o = { a: 1 }; + const y = { ...o }; + const { ...x } = y; + ==== tests/cases/compiler/script.ts (0 errors) ==== class A { } class B extends A { } @@ -33,4 +41,5 @@ error TS2305: Module 'tslib' has no exported member '__param'. } ==== tests/cases/compiler/tslib.d.ts (0 errors) ==== - export {} \ No newline at end of file + export {} + \ No newline at end of file diff --git a/tests/baselines/reference/importHelpersNoHelpers.js b/tests/baselines/reference/importHelpersNoHelpers.js index e22d1f4353d71..690a6c05f17f8 100644 --- a/tests/baselines/reference/importHelpersNoHelpers.js +++ b/tests/baselines/reference/importHelpersNoHelpers.js @@ -11,6 +11,10 @@ class C { method(@dec x: number) { } } + +const o = { a: 1 }; +const y = { ...o }; +const { ...x } = y; //// [script.ts] class A { } @@ -25,7 +29,8 @@ class C { } //// [tslib.d.ts] -export {} +export {} + //// [external.js] "use strict"; @@ -61,6 +66,9 @@ C = tslib_1.__decorate([ dec, tslib_1.__metadata("design:paramtypes", []) ], C); +var o = { a: 1 }; +var y = __assign({}, o); +var x = __rest(y, []); //// [script.js] var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; diff --git a/tests/cases/compiler/importHelpersNoHelpers.ts b/tests/cases/compiler/importHelpersNoHelpers.ts index 8242855254806..4ab48aba7df34 100644 --- a/tests/cases/compiler/importHelpersNoHelpers.ts +++ b/tests/cases/compiler/importHelpersNoHelpers.ts @@ -16,6 +16,10 @@ class C { } } +const o = { a: 1 }; +const y = { ...o }; +const { ...x } = y; + // @filename: script.ts class A { } class B extends A { } @@ -29,4 +33,4 @@ class C { } // @filename: tslib.d.ts -export {} \ No newline at end of file +export {}