Move check for module kind is ES2015 into grammar check; Use checkNonNullExpression and add tests

This commit is contained in:
Yui T
2017-04-26 14:16:44 -07:00
parent 2f61d472ed
commit a10e668c34
7 changed files with 166 additions and 5 deletions
+5 -5
View File
@@ -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);
}
}
}
}
@@ -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'.
@@ -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);
@@ -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'.
@@ -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);
@@ -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);
@@ -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);