From a10e668c3409c89960f4cb8b91be098481e65cdf Mon Sep 17 00:00:00 2001 From: Yui T Date: Wed, 26 Apr 2017 14:16:44 -0700 Subject: [PATCH] Move check for module kind is ES2015 into grammar check; Use checkNonNullExpression and add tests --- src/compiler/checker.ts | 10 +++--- .../importCallExpression5ES2018.errors.txt | 31 +++++++++++++++++ .../reference/importCallExpression5ES2018.js | 33 +++++++++++++++++++ .../importCallExpression6ES2018.errors.txt | 25 ++++++++++++++ .../reference/importCallExpression6ES2018.js | 33 +++++++++++++++++++ .../importCallExpression5ES2018.ts | 20 +++++++++++ .../importCallExpression6ES2018.ts | 19 +++++++++++ 7 files changed, 166 insertions(+), 5 deletions(-) create mode 100644 tests/baselines/reference/importCallExpression5ES2018.errors.txt create mode 100644 tests/baselines/reference/importCallExpression5ES2018.js create mode 100644 tests/baselines/reference/importCallExpression6ES2018.errors.txt create mode 100644 tests/baselines/reference/importCallExpression6ES2018.js create mode 100644 tests/cases/conformance/es2018/dynamicImport/importCallExpression5ES2018.ts create mode 100644 tests/cases/conformance/es2018/dynamicImport/importCallExpression6ES2018.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 1089e9d2c7d..8eb163e7aa8 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -15580,12 +15580,8 @@ namespace ts { return createPromiseReturnType(node, anyType); } - if (modulekind === ModuleKind.ES2015) { - grammarErrorOnNode(node, Diagnostics.Dynamic_import_cannot_be_used_when_targeting_ECMAScript_2015_modules); - } - const specifier = node.arguments[0]; - const specifierType = checkExpression(specifier); + const specifierType = checkNonNullExpression(specifier); if (!isTypeAssignableTo(specifierType, stringType)) { error(specifier, Diagnostics.Dynamic_import_s_specifier_must_be_of_type_string_but_here_has_type_0, typeToString(specifierType)); } @@ -24081,6 +24077,10 @@ namespace ts { if (isSpreadExpression(arguments[0])) { return grammarErrorOnNode(arguments[0], Diagnostics.Specifier_of_dynamic_import_cannot_be_spread_element); } + + if (modulekind === ModuleKind.ES2015) { + grammarErrorOnNode(node, Diagnostics.Dynamic_import_cannot_be_used_when_targeting_ECMAScript_2015_modules); + } } } } \ No newline at end of file diff --git a/tests/baselines/reference/importCallExpression5ES2018.errors.txt b/tests/baselines/reference/importCallExpression5ES2018.errors.txt new file mode 100644 index 00000000000..372fda0a685 --- /dev/null +++ b/tests/baselines/reference/importCallExpression5ES2018.errors.txt @@ -0,0 +1,31 @@ +tests/cases/conformance/es2018/dynamicImport/2.ts(3,23): error TS2532: Object is possibly 'undefined'. +tests/cases/conformance/es2018/dynamicImport/2.ts(4,24): error TS2532: Object is possibly 'undefined'. +tests/cases/conformance/es2018/dynamicImport/2.ts(5,24): error TS2531: Object is possibly 'null'. +tests/cases/conformance/es2018/dynamicImport/2.ts(6,24): error TS2531: Object is possibly 'null'. + + +==== tests/cases/conformance/es2018/dynamicImport/0.ts (0 errors) ==== + export class B { + print() { return "I am B"} + } + + export function foo() { return "foo" } + +==== tests/cases/conformance/es2018/dynamicImport/1.ts (0 errors) ==== + export function backup() { return "backup"; } + +==== tests/cases/conformance/es2018/dynamicImport/2.ts (4 errors) ==== + declare function bar(): boolean; + const specify = bar() ? "./0" : undefined; + let myModule = import(specify); + ~~~~~~~ +!!! error TS2532: Object is possibly 'undefined'. + let myModule1 = import(undefined); + ~~~~~~~~~ +!!! error TS2532: Object is possibly 'undefined'. + let myModule2 = import(bar() ? "./1" : null); + ~~~~~~~~~~~~~~~~~~~~ +!!! error TS2531: Object is possibly 'null'. + let myModule3 = import(null); + ~~~~ +!!! error TS2531: Object is possibly 'null'. \ No newline at end of file diff --git a/tests/baselines/reference/importCallExpression5ES2018.js b/tests/baselines/reference/importCallExpression5ES2018.js new file mode 100644 index 00000000000..802988cedbc --- /dev/null +++ b/tests/baselines/reference/importCallExpression5ES2018.js @@ -0,0 +1,33 @@ +//// [tests/cases/conformance/es2018/dynamicImport/importCallExpression5ES2018.ts] //// + +//// [0.ts] +export class B { + print() { return "I am B"} +} + +export function foo() { return "foo" } + +//// [1.ts] +export function backup() { return "backup"; } + +//// [2.ts] +declare function bar(): boolean; +const specify = bar() ? "./0" : undefined; +let myModule = import(specify); +let myModule1 = import(undefined); +let myModule2 = import(bar() ? "./1" : null); +let myModule3 = import(null); + +//// [0.js] +export class B { + print() { return "I am B"; } +} +export function foo() { return "foo"; } +//// [1.js] +export function backup() { return "backup"; } +//// [2.js] +const specify = bar() ? "./0" : undefined; +let myModule = import(specify); +let myModule1 = import(undefined); +let myModule2 = import(bar() ? "./1" : null); +let myModule3 = import(null); diff --git a/tests/baselines/reference/importCallExpression6ES2018.errors.txt b/tests/baselines/reference/importCallExpression6ES2018.errors.txt new file mode 100644 index 00000000000..33f93ef4d39 --- /dev/null +++ b/tests/baselines/reference/importCallExpression6ES2018.errors.txt @@ -0,0 +1,25 @@ +tests/cases/conformance/es2018/dynamicImport/2.ts(4,24): error TS2532: Object is possibly 'undefined'. +tests/cases/conformance/es2018/dynamicImport/2.ts(6,24): error TS2531: Object is possibly 'null'. + + +==== tests/cases/conformance/es2018/dynamicImport/0.ts (0 errors) ==== + export class B { + print() { return "I am B"} + } + + export function foo() { return "foo" } + +==== tests/cases/conformance/es2018/dynamicImport/1.ts (0 errors) ==== + export function backup() { return "backup"; } + +==== tests/cases/conformance/es2018/dynamicImport/2.ts (2 errors) ==== + declare function bar(): boolean; + const specify = bar() ? "./0" : undefined; + let myModule = import(specify); + let myModule1 = import(undefined); + ~~~~~~~~~ +!!! error TS2532: Object is possibly 'undefined'. + let myModule2 = import(bar() ? "./1" : null); + let myModule3 = import(null); + ~~~~ +!!! error TS2531: Object is possibly 'null'. \ No newline at end of file diff --git a/tests/baselines/reference/importCallExpression6ES2018.js b/tests/baselines/reference/importCallExpression6ES2018.js new file mode 100644 index 00000000000..cde74278f33 --- /dev/null +++ b/tests/baselines/reference/importCallExpression6ES2018.js @@ -0,0 +1,33 @@ +//// [tests/cases/conformance/es2018/dynamicImport/importCallExpression6ES2018.ts] //// + +//// [0.ts] +export class B { + print() { return "I am B"} +} + +export function foo() { return "foo" } + +//// [1.ts] +export function backup() { return "backup"; } + +//// [2.ts] +declare function bar(): boolean; +const specify = bar() ? "./0" : undefined; +let myModule = import(specify); +let myModule1 = import(undefined); +let myModule2 = import(bar() ? "./1" : null); +let myModule3 = import(null); + +//// [0.js] +export class B { + print() { return "I am B"; } +} +export function foo() { return "foo"; } +//// [1.js] +export function backup() { return "backup"; } +//// [2.js] +const specify = bar() ? "./0" : undefined; +let myModule = import(specify); +let myModule1 = import(undefined); +let myModule2 = import(bar() ? "./1" : null); +let myModule3 = import(null); diff --git a/tests/cases/conformance/es2018/dynamicImport/importCallExpression5ES2018.ts b/tests/cases/conformance/es2018/dynamicImport/importCallExpression5ES2018.ts new file mode 100644 index 00000000000..254e99f3907 --- /dev/null +++ b/tests/cases/conformance/es2018/dynamicImport/importCallExpression5ES2018.ts @@ -0,0 +1,20 @@ +// @module: es2018 +// @target: esnext +// @strictNullChecks: true +// @filename: 0.ts +export class B { + print() { return "I am B"} +} + +export function foo() { return "foo" } + +// @filename: 1.ts +export function backup() { return "backup"; } + +// @filename: 2.ts +declare function bar(): boolean; +const specify = bar() ? "./0" : undefined; +let myModule = import(specify); +let myModule1 = import(undefined); +let myModule2 = import(bar() ? "./1" : null); +let myModule3 = import(null); \ No newline at end of file diff --git a/tests/cases/conformance/es2018/dynamicImport/importCallExpression6ES2018.ts b/tests/cases/conformance/es2018/dynamicImport/importCallExpression6ES2018.ts new file mode 100644 index 00000000000..8c1a1071fbc --- /dev/null +++ b/tests/cases/conformance/es2018/dynamicImport/importCallExpression6ES2018.ts @@ -0,0 +1,19 @@ +// @module: es2018 +// @target: esnext +// @filename: 0.ts +export class B { + print() { return "I am B"} +} + +export function foo() { return "foo" } + +// @filename: 1.ts +export function backup() { return "backup"; } + +// @filename: 2.ts +declare function bar(): boolean; +const specify = bar() ? "./0" : undefined; +let myModule = import(specify); +let myModule1 = import(undefined); +let myModule2 = import(bar() ? "./1" : null); +let myModule3 = import(null); \ No newline at end of file