Skip to content

Commit 8a9e234

Browse files
committed
Add more case
1 parent 1ed6a3e commit 8a9e234

14 files changed

+466
-6
lines changed

src/compiler/binder.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -915,9 +915,6 @@ namespace ts {
915915
function isNarrowingBinaryExpression(expr: BinaryExpression) {
916916
switch (expr.operatorToken.kind) {
917917
case SyntaxKind.EqualsToken:
918-
case SyntaxKind.BarBarEqualsToken:
919-
case SyntaxKind.AmpersandAmpersandEqualsToken:
920-
case SyntaxKind.QuestionQuestionEqualsToken:
921918
return containsNarrowableReference(expr.left);
922919
case SyntaxKind.EqualsEqualsToken:
923920
case SyntaxKind.ExclamationEqualsToken:
@@ -942,9 +939,6 @@ namespace ts {
942939
case SyntaxKind.BinaryExpression:
943940
switch ((<BinaryExpression>expr).operatorToken.kind) {
944941
case SyntaxKind.EqualsToken:
945-
case SyntaxKind.BarBarEqualsToken:
946-
case SyntaxKind.AmpersandAmpersandEqualsToken:
947-
case SyntaxKind.QuestionQuestionEqualsToken:
948942
return isNarrowableOperand((<BinaryExpression>expr).left);
949943
case SyntaxKind.CommaToken:
950944
return isNarrowableOperand((<BinaryExpression>expr).right);
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
tests/cases/conformance/esnext/logicalAssignment/logicalAssignment8.ts(12,5): error TS2532: Object is possibly 'undefined'.
2+
3+
4+
==== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment8.ts (1 errors) ====
5+
declare const bar: { value?: number[] } | undefined
6+
7+
function foo1(results: number[] | undefined) {
8+
(results ||= bar?.value ?? []).push(100);
9+
}
10+
11+
function foo2(results: number[] | undefined) {
12+
(results ??= bar?.value ?? []).push(100);
13+
}
14+
15+
function foo3(results: number[] | undefined) {
16+
(results &&= bar?.value ?? []).push(100);
17+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18+
!!! error TS2532: Object is possibly 'undefined'.
19+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
//// [logicalAssignment8.ts]
2+
declare const bar: { value?: number[] } | undefined
3+
4+
function foo1(results: number[] | undefined) {
5+
(results ||= bar?.value ?? []).push(100);
6+
}
7+
8+
function foo2(results: number[] | undefined) {
9+
(results ??= bar?.value ?? []).push(100);
10+
}
11+
12+
function foo3(results: number[] | undefined) {
13+
(results &&= bar?.value ?? []).push(100);
14+
}
15+
16+
//// [logicalAssignment8.js]
17+
"use strict";
18+
function foo1(results) {
19+
var _a;
20+
(results || (results = (_a = bar === null || bar === void 0 ? void 0 : bar.value) !== null && _a !== void 0 ? _a : [])).push(100);
21+
}
22+
function foo2(results) {
23+
var _a;
24+
(results !== null && results !== void 0 ? results : (results = (_a = bar === null || bar === void 0 ? void 0 : bar.value) !== null && _a !== void 0 ? _a : [])).push(100);
25+
}
26+
function foo3(results) {
27+
var _a;
28+
(results && (results = (_a = bar === null || bar === void 0 ? void 0 : bar.value) !== null && _a !== void 0 ? _a : [])).push(100);
29+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment8.ts ===
2+
declare const bar: { value?: number[] } | undefined
3+
>bar : Symbol(bar, Decl(logicalAssignment8.ts, 0, 13))
4+
>value : Symbol(value, Decl(logicalAssignment8.ts, 0, 20))
5+
6+
function foo1(results: number[] | undefined) {
7+
>foo1 : Symbol(foo1, Decl(logicalAssignment8.ts, 0, 51))
8+
>results : Symbol(results, Decl(logicalAssignment8.ts, 2, 14))
9+
10+
(results ||= bar?.value ?? []).push(100);
11+
>(results ||= bar?.value ?? []).push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
12+
>results : Symbol(results, Decl(logicalAssignment8.ts, 2, 14))
13+
>bar?.value : Symbol(value, Decl(logicalAssignment8.ts, 0, 20))
14+
>bar : Symbol(bar, Decl(logicalAssignment8.ts, 0, 13))
15+
>value : Symbol(value, Decl(logicalAssignment8.ts, 0, 20))
16+
>push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
17+
}
18+
19+
function foo2(results: number[] | undefined) {
20+
>foo2 : Symbol(foo2, Decl(logicalAssignment8.ts, 4, 1))
21+
>results : Symbol(results, Decl(logicalAssignment8.ts, 6, 14))
22+
23+
(results ??= bar?.value ?? []).push(100);
24+
>(results ??= bar?.value ?? []).push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
25+
>results : Symbol(results, Decl(logicalAssignment8.ts, 6, 14))
26+
>bar?.value : Symbol(value, Decl(logicalAssignment8.ts, 0, 20))
27+
>bar : Symbol(bar, Decl(logicalAssignment8.ts, 0, 13))
28+
>value : Symbol(value, Decl(logicalAssignment8.ts, 0, 20))
29+
>push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
30+
}
31+
32+
function foo3(results: number[] | undefined) {
33+
>foo3 : Symbol(foo3, Decl(logicalAssignment8.ts, 8, 1))
34+
>results : Symbol(results, Decl(logicalAssignment8.ts, 10, 14))
35+
36+
(results &&= bar?.value ?? []).push(100);
37+
>(results &&= bar?.value ?? []).push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
38+
>results : Symbol(results, Decl(logicalAssignment8.ts, 10, 14))
39+
>bar?.value : Symbol(value, Decl(logicalAssignment8.ts, 0, 20))
40+
>bar : Symbol(bar, Decl(logicalAssignment8.ts, 0, 13))
41+
>value : Symbol(value, Decl(logicalAssignment8.ts, 0, 20))
42+
>push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
43+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment8.ts ===
2+
declare const bar: { value?: number[] } | undefined
3+
>bar : { value?: number[] | undefined; } | undefined
4+
>value : number[] | undefined
5+
6+
function foo1(results: number[] | undefined) {
7+
>foo1 : (results: number[] | undefined) => void
8+
>results : number[] | undefined
9+
10+
(results ||= bar?.value ?? []).push(100);
11+
>(results ||= bar?.value ?? []).push(100) : number
12+
>(results ||= bar?.value ?? []).push : (...items: number[]) => number
13+
>(results ||= bar?.value ?? []) : number[]
14+
>results ||= bar?.value ?? [] : number[]
15+
>results : number[] | undefined
16+
>bar?.value ?? [] : number[]
17+
>bar?.value : number[] | undefined
18+
>bar : { value?: number[] | undefined; } | undefined
19+
>value : number[] | undefined
20+
>[] : never[]
21+
>push : (...items: number[]) => number
22+
>100 : 100
23+
}
24+
25+
function foo2(results: number[] | undefined) {
26+
>foo2 : (results: number[] | undefined) => void
27+
>results : number[] | undefined
28+
29+
(results ??= bar?.value ?? []).push(100);
30+
>(results ??= bar?.value ?? []).push(100) : number
31+
>(results ??= bar?.value ?? []).push : (...items: number[]) => number
32+
>(results ??= bar?.value ?? []) : number[]
33+
>results ??= bar?.value ?? [] : number[]
34+
>results : number[] | undefined
35+
>bar?.value ?? [] : number[]
36+
>bar?.value : number[] | undefined
37+
>bar : { value?: number[] | undefined; } | undefined
38+
>value : number[] | undefined
39+
>[] : never[]
40+
>push : (...items: number[]) => number
41+
>100 : 100
42+
}
43+
44+
function foo3(results: number[] | undefined) {
45+
>foo3 : (results: number[] | undefined) => void
46+
>results : number[] | undefined
47+
48+
(results &&= bar?.value ?? []).push(100);
49+
>(results &&= bar?.value ?? []).push(100) : number
50+
>(results &&= bar?.value ?? []).push : (...items: number[]) => number
51+
>(results &&= bar?.value ?? []) : number[] | undefined
52+
>results &&= bar?.value ?? [] : number[] | undefined
53+
>results : number[] | undefined
54+
>bar?.value ?? [] : number[]
55+
>bar?.value : number[] | undefined
56+
>bar : { value?: number[] | undefined; } | undefined
57+
>value : number[] | undefined
58+
>[] : never[]
59+
>push : (...items: number[]) => number
60+
>100 : 100
61+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
tests/cases/conformance/esnext/logicalAssignment/logicalAssignment8.ts(12,5): error TS2532: Object is possibly 'undefined'.
2+
3+
4+
==== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment8.ts (1 errors) ====
5+
declare const bar: { value?: number[] } | undefined
6+
7+
function foo1(results: number[] | undefined) {
8+
(results ||= bar?.value ?? []).push(100);
9+
}
10+
11+
function foo2(results: number[] | undefined) {
12+
(results ??= bar?.value ?? []).push(100);
13+
}
14+
15+
function foo3(results: number[] | undefined) {
16+
(results &&= bar?.value ?? []).push(100);
17+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18+
!!! error TS2532: Object is possibly 'undefined'.
19+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//// [logicalAssignment8.ts]
2+
declare const bar: { value?: number[] } | undefined
3+
4+
function foo1(results: number[] | undefined) {
5+
(results ||= bar?.value ?? []).push(100);
6+
}
7+
8+
function foo2(results: number[] | undefined) {
9+
(results ??= bar?.value ?? []).push(100);
10+
}
11+
12+
function foo3(results: number[] | undefined) {
13+
(results &&= bar?.value ?? []).push(100);
14+
}
15+
16+
//// [logicalAssignment8.js]
17+
"use strict";
18+
function foo1(results) {
19+
(results || (results = bar?.value ?? [])).push(100);
20+
}
21+
function foo2(results) {
22+
(results ?? (results = bar?.value ?? [])).push(100);
23+
}
24+
function foo3(results) {
25+
(results && (results = bar?.value ?? [])).push(100);
26+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment8.ts ===
2+
declare const bar: { value?: number[] } | undefined
3+
>bar : Symbol(bar, Decl(logicalAssignment8.ts, 0, 13))
4+
>value : Symbol(value, Decl(logicalAssignment8.ts, 0, 20))
5+
6+
function foo1(results: number[] | undefined) {
7+
>foo1 : Symbol(foo1, Decl(logicalAssignment8.ts, 0, 51))
8+
>results : Symbol(results, Decl(logicalAssignment8.ts, 2, 14))
9+
10+
(results ||= bar?.value ?? []).push(100);
11+
>(results ||= bar?.value ?? []).push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
12+
>results : Symbol(results, Decl(logicalAssignment8.ts, 2, 14))
13+
>bar?.value : Symbol(value, Decl(logicalAssignment8.ts, 0, 20))
14+
>bar : Symbol(bar, Decl(logicalAssignment8.ts, 0, 13))
15+
>value : Symbol(value, Decl(logicalAssignment8.ts, 0, 20))
16+
>push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
17+
}
18+
19+
function foo2(results: number[] | undefined) {
20+
>foo2 : Symbol(foo2, Decl(logicalAssignment8.ts, 4, 1))
21+
>results : Symbol(results, Decl(logicalAssignment8.ts, 6, 14))
22+
23+
(results ??= bar?.value ?? []).push(100);
24+
>(results ??= bar?.value ?? []).push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
25+
>results : Symbol(results, Decl(logicalAssignment8.ts, 6, 14))
26+
>bar?.value : Symbol(value, Decl(logicalAssignment8.ts, 0, 20))
27+
>bar : Symbol(bar, Decl(logicalAssignment8.ts, 0, 13))
28+
>value : Symbol(value, Decl(logicalAssignment8.ts, 0, 20))
29+
>push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
30+
}
31+
32+
function foo3(results: number[] | undefined) {
33+
>foo3 : Symbol(foo3, Decl(logicalAssignment8.ts, 8, 1))
34+
>results : Symbol(results, Decl(logicalAssignment8.ts, 10, 14))
35+
36+
(results &&= bar?.value ?? []).push(100);
37+
>(results &&= bar?.value ?? []).push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
38+
>results : Symbol(results, Decl(logicalAssignment8.ts, 10, 14))
39+
>bar?.value : Symbol(value, Decl(logicalAssignment8.ts, 0, 20))
40+
>bar : Symbol(bar, Decl(logicalAssignment8.ts, 0, 13))
41+
>value : Symbol(value, Decl(logicalAssignment8.ts, 0, 20))
42+
>push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --))
43+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment8.ts ===
2+
declare const bar: { value?: number[] } | undefined
3+
>bar : { value?: number[] | undefined; } | undefined
4+
>value : number[] | undefined
5+
6+
function foo1(results: number[] | undefined) {
7+
>foo1 : (results: number[] | undefined) => void
8+
>results : number[] | undefined
9+
10+
(results ||= bar?.value ?? []).push(100);
11+
>(results ||= bar?.value ?? []).push(100) : number
12+
>(results ||= bar?.value ?? []).push : (...items: number[]) => number
13+
>(results ||= bar?.value ?? []) : number[]
14+
>results ||= bar?.value ?? [] : number[]
15+
>results : number[] | undefined
16+
>bar?.value ?? [] : number[]
17+
>bar?.value : number[] | undefined
18+
>bar : { value?: number[] | undefined; } | undefined
19+
>value : number[] | undefined
20+
>[] : never[]
21+
>push : (...items: number[]) => number
22+
>100 : 100
23+
}
24+
25+
function foo2(results: number[] | undefined) {
26+
>foo2 : (results: number[] | undefined) => void
27+
>results : number[] | undefined
28+
29+
(results ??= bar?.value ?? []).push(100);
30+
>(results ??= bar?.value ?? []).push(100) : number
31+
>(results ??= bar?.value ?? []).push : (...items: number[]) => number
32+
>(results ??= bar?.value ?? []) : number[]
33+
>results ??= bar?.value ?? [] : number[]
34+
>results : number[] | undefined
35+
>bar?.value ?? [] : number[]
36+
>bar?.value : number[] | undefined
37+
>bar : { value?: number[] | undefined; } | undefined
38+
>value : number[] | undefined
39+
>[] : never[]
40+
>push : (...items: number[]) => number
41+
>100 : 100
42+
}
43+
44+
function foo3(results: number[] | undefined) {
45+
>foo3 : (results: number[] | undefined) => void
46+
>results : number[] | undefined
47+
48+
(results &&= bar?.value ?? []).push(100);
49+
>(results &&= bar?.value ?? []).push(100) : number
50+
>(results &&= bar?.value ?? []).push : (...items: number[]) => number
51+
>(results &&= bar?.value ?? []) : number[] | undefined
52+
>results &&= bar?.value ?? [] : number[] | undefined
53+
>results : number[] | undefined
54+
>bar?.value ?? [] : number[]
55+
>bar?.value : number[] | undefined
56+
>bar : { value?: number[] | undefined; } | undefined
57+
>value : number[] | undefined
58+
>[] : never[]
59+
>push : (...items: number[]) => number
60+
>100 : 100
61+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
tests/cases/conformance/esnext/logicalAssignment/logicalAssignment8.ts(12,5): error TS2532: Object is possibly 'undefined'.
2+
3+
4+
==== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment8.ts (1 errors) ====
5+
declare const bar: { value?: number[] } | undefined
6+
7+
function foo1(results: number[] | undefined) {
8+
(results ||= bar?.value ?? []).push(100);
9+
}
10+
11+
function foo2(results: number[] | undefined) {
12+
(results ??= bar?.value ?? []).push(100);
13+
}
14+
15+
function foo3(results: number[] | undefined) {
16+
(results &&= bar?.value ?? []).push(100);
17+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18+
!!! error TS2532: Object is possibly 'undefined'.
19+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//// [logicalAssignment8.ts]
2+
declare const bar: { value?: number[] } | undefined
3+
4+
function foo1(results: number[] | undefined) {
5+
(results ||= bar?.value ?? []).push(100);
6+
}
7+
8+
function foo2(results: number[] | undefined) {
9+
(results ??= bar?.value ?? []).push(100);
10+
}
11+
12+
function foo3(results: number[] | undefined) {
13+
(results &&= bar?.value ?? []).push(100);
14+
}
15+
16+
//// [logicalAssignment8.js]
17+
"use strict";
18+
function foo1(results) {
19+
(results ||= bar?.value ?? []).push(100);
20+
}
21+
function foo2(results) {
22+
(results ??= bar?.value ?? []).push(100);
23+
}
24+
function foo3(results) {
25+
(results &&= bar?.value ?? []).push(100);
26+
}

0 commit comments

Comments
 (0)