Skip to content

Commit a10e668

Browse files
author
Yui T
committed
Move check for module kind is ES2015 into grammar check; Use checkNonNullExpression and add tests
1 parent 2f61d47 commit a10e668

File tree

7 files changed

+166
-5
lines changed

7 files changed

+166
-5
lines changed

src/compiler/checker.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15580,12 +15580,8 @@ namespace ts {
1558015580
return createPromiseReturnType(node, anyType);
1558115581
}
1558215582

15583-
if (modulekind === ModuleKind.ES2015) {
15584-
grammarErrorOnNode(node, Diagnostics.Dynamic_import_cannot_be_used_when_targeting_ECMAScript_2015_modules);
15585-
}
15586-
1558715583
const specifier = node.arguments[0];
15588-
const specifierType = checkExpression(specifier);
15584+
const specifierType = checkNonNullExpression(specifier);
1558915585
if (!isTypeAssignableTo(specifierType, stringType)) {
1559015586
error(specifier, Diagnostics.Dynamic_import_s_specifier_must_be_of_type_string_but_here_has_type_0, typeToString(specifierType));
1559115587
}
@@ -24081,6 +24077,10 @@ namespace ts {
2408124077
if (isSpreadExpression(arguments[0])) {
2408224078
return grammarErrorOnNode(arguments[0], Diagnostics.Specifier_of_dynamic_import_cannot_be_spread_element);
2408324079
}
24080+
24081+
if (modulekind === ModuleKind.ES2015) {
24082+
grammarErrorOnNode(node, Diagnostics.Dynamic_import_cannot_be_used_when_targeting_ECMAScript_2015_modules);
24083+
}
2408424084
}
2408524085
}
2408624086
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
tests/cases/conformance/es2018/dynamicImport/2.ts(3,23): error TS2532: Object is possibly 'undefined'.
2+
tests/cases/conformance/es2018/dynamicImport/2.ts(4,24): error TS2532: Object is possibly 'undefined'.
3+
tests/cases/conformance/es2018/dynamicImport/2.ts(5,24): error TS2531: Object is possibly 'null'.
4+
tests/cases/conformance/es2018/dynamicImport/2.ts(6,24): error TS2531: Object is possibly 'null'.
5+
6+
7+
==== tests/cases/conformance/es2018/dynamicImport/0.ts (0 errors) ====
8+
export class B {
9+
print() { return "I am B"}
10+
}
11+
12+
export function foo() { return "foo" }
13+
14+
==== tests/cases/conformance/es2018/dynamicImport/1.ts (0 errors) ====
15+
export function backup() { return "backup"; }
16+
17+
==== tests/cases/conformance/es2018/dynamicImport/2.ts (4 errors) ====
18+
declare function bar(): boolean;
19+
const specify = bar() ? "./0" : undefined;
20+
let myModule = import(specify);
21+
~~~~~~~
22+
!!! error TS2532: Object is possibly 'undefined'.
23+
let myModule1 = import(undefined);
24+
~~~~~~~~~
25+
!!! error TS2532: Object is possibly 'undefined'.
26+
let myModule2 = import(bar() ? "./1" : null);
27+
~~~~~~~~~~~~~~~~~~~~
28+
!!! error TS2531: Object is possibly 'null'.
29+
let myModule3 = import(null);
30+
~~~~
31+
!!! error TS2531: Object is possibly 'null'.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//// [tests/cases/conformance/es2018/dynamicImport/importCallExpression5ES2018.ts] ////
2+
3+
//// [0.ts]
4+
export class B {
5+
print() { return "I am B"}
6+
}
7+
8+
export function foo() { return "foo" }
9+
10+
//// [1.ts]
11+
export function backup() { return "backup"; }
12+
13+
//// [2.ts]
14+
declare function bar(): boolean;
15+
const specify = bar() ? "./0" : undefined;
16+
let myModule = import(specify);
17+
let myModule1 = import(undefined);
18+
let myModule2 = import(bar() ? "./1" : null);
19+
let myModule3 = import(null);
20+
21+
//// [0.js]
22+
export class B {
23+
print() { return "I am B"; }
24+
}
25+
export function foo() { return "foo"; }
26+
//// [1.js]
27+
export function backup() { return "backup"; }
28+
//// [2.js]
29+
const specify = bar() ? "./0" : undefined;
30+
let myModule = import(specify);
31+
let myModule1 = import(undefined);
32+
let myModule2 = import(bar() ? "./1" : null);
33+
let myModule3 = import(null);
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
tests/cases/conformance/es2018/dynamicImport/2.ts(4,24): error TS2532: Object is possibly 'undefined'.
2+
tests/cases/conformance/es2018/dynamicImport/2.ts(6,24): error TS2531: Object is possibly 'null'.
3+
4+
5+
==== tests/cases/conformance/es2018/dynamicImport/0.ts (0 errors) ====
6+
export class B {
7+
print() { return "I am B"}
8+
}
9+
10+
export function foo() { return "foo" }
11+
12+
==== tests/cases/conformance/es2018/dynamicImport/1.ts (0 errors) ====
13+
export function backup() { return "backup"; }
14+
15+
==== tests/cases/conformance/es2018/dynamicImport/2.ts (2 errors) ====
16+
declare function bar(): boolean;
17+
const specify = bar() ? "./0" : undefined;
18+
let myModule = import(specify);
19+
let myModule1 = import(undefined);
20+
~~~~~~~~~
21+
!!! error TS2532: Object is possibly 'undefined'.
22+
let myModule2 = import(bar() ? "./1" : null);
23+
let myModule3 = import(null);
24+
~~~~
25+
!!! error TS2531: Object is possibly 'null'.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//// [tests/cases/conformance/es2018/dynamicImport/importCallExpression6ES2018.ts] ////
2+
3+
//// [0.ts]
4+
export class B {
5+
print() { return "I am B"}
6+
}
7+
8+
export function foo() { return "foo" }
9+
10+
//// [1.ts]
11+
export function backup() { return "backup"; }
12+
13+
//// [2.ts]
14+
declare function bar(): boolean;
15+
const specify = bar() ? "./0" : undefined;
16+
let myModule = import(specify);
17+
let myModule1 = import(undefined);
18+
let myModule2 = import(bar() ? "./1" : null);
19+
let myModule3 = import(null);
20+
21+
//// [0.js]
22+
export class B {
23+
print() { return "I am B"; }
24+
}
25+
export function foo() { return "foo"; }
26+
//// [1.js]
27+
export function backup() { return "backup"; }
28+
//// [2.js]
29+
const specify = bar() ? "./0" : undefined;
30+
let myModule = import(specify);
31+
let myModule1 = import(undefined);
32+
let myModule2 = import(bar() ? "./1" : null);
33+
let myModule3 = import(null);
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// @module: es2018
2+
// @target: esnext
3+
// @strictNullChecks: true
4+
// @filename: 0.ts
5+
export class B {
6+
print() { return "I am B"}
7+
}
8+
9+
export function foo() { return "foo" }
10+
11+
// @filename: 1.ts
12+
export function backup() { return "backup"; }
13+
14+
// @filename: 2.ts
15+
declare function bar(): boolean;
16+
const specify = bar() ? "./0" : undefined;
17+
let myModule = import(specify);
18+
let myModule1 = import(undefined);
19+
let myModule2 = import(bar() ? "./1" : null);
20+
let myModule3 = import(null);
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// @module: es2018
2+
// @target: esnext
3+
// @filename: 0.ts
4+
export class B {
5+
print() { return "I am B"}
6+
}
7+
8+
export function foo() { return "foo" }
9+
10+
// @filename: 1.ts
11+
export function backup() { return "backup"; }
12+
13+
// @filename: 2.ts
14+
declare function bar(): boolean;
15+
const specify = bar() ? "./0" : undefined;
16+
let myModule = import(specify);
17+
let myModule1 = import(undefined);
18+
let myModule2 = import(bar() ? "./1" : null);
19+
let myModule3 = import(null);

0 commit comments

Comments
 (0)