Skip to content

Commit 71b2ba6

Browse files
authored
Reuse computed type of condition expressions (microsoft#49881)
1 parent 8778c1d commit 71b2ba6

5 files changed

+135
-7
lines changed

src/compiler/checker.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34108,7 +34108,7 @@ namespace ts {
3410834108
|| isBinaryExpression(parent) && (parent.operatorToken.kind === SyntaxKind.AmpersandAmpersandToken || parent.operatorToken.kind === SyntaxKind.BarBarToken)) {
3410934109
parent = parent.parent;
3411034110
}
34111-
checkTestingKnownTruthyCallableOrAwaitableType(node.left, isIfStatement(parent) ? parent.thenStatement : undefined);
34111+
checkTestingKnownTruthyCallableOrAwaitableType(node.left, leftType, isIfStatement(parent) ? parent.thenStatement : undefined);
3411234112
}
3411334113
checkTruthinessOfType(leftType, node.left);
3411434114
}
@@ -34685,8 +34685,8 @@ namespace ts {
3468534685
}
3468634686

3468734687
function checkConditionalExpression(node: ConditionalExpression, checkMode?: CheckMode): Type {
34688-
checkTruthinessExpression(node.condition);
34689-
checkTestingKnownTruthyCallableOrAwaitableType(node.condition, node.whenTrue);
34688+
const type = checkTruthinessExpression(node.condition);
34689+
checkTestingKnownTruthyCallableOrAwaitableType(node.condition, type, node.whenTrue);
3469034690
const type1 = checkExpression(node.whenTrue, checkMode);
3469134691
const type2 = checkExpression(node.whenFalse, checkMode);
3469234692
return getUnionType([type1, type2], UnionReduction.Subtype);
@@ -38391,8 +38391,8 @@ namespace ts {
3839138391
function checkIfStatement(node: IfStatement) {
3839238392
// Grammar checking
3839338393
checkGrammarStatementInAmbientContext(node);
38394-
checkTruthinessExpression(node.expression);
38395-
checkTestingKnownTruthyCallableOrAwaitableType(node.expression, node.thenStatement);
38394+
const type = checkTruthinessExpression(node.expression);
38395+
checkTestingKnownTruthyCallableOrAwaitableType(node.expression, type, node.thenStatement);
3839638396
checkSourceElement(node.thenStatement);
3839738397

3839838398
if (node.thenStatement.kind === SyntaxKind.EmptyStatement) {
@@ -38402,7 +38402,7 @@ namespace ts {
3840238402
checkSourceElement(node.elseStatement);
3840338403
}
3840438404

38405-
function checkTestingKnownTruthyCallableOrAwaitableType(condExpr: Expression, body?: Statement | Expression) {
38405+
function checkTestingKnownTruthyCallableOrAwaitableType(condExpr: Expression, condType: Type, body?: Statement | Expression) {
3840638406
if (!strictNullChecks) return;
3840738407

3840838408
helper(condExpr, body);
@@ -38417,7 +38417,7 @@ namespace ts {
3841738417
? condExpr.right
3841838418
: condExpr;
3841938419
if (isModuleExportsAccessExpression(location)) return;
38420-
const type = checkTruthinessExpression(location);
38420+
const type = location === condExpr ? condType : checkTruthinessExpression(location);
3842138421
const isPropertyExpressionCast = isPropertyAccessExpression(location) && isTypeAssertion(location.expression);
3842238422
if (!(getTypeFacts(type) & TypeFacts.Truthy) || isPropertyExpressionCast) return;
3842338423

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
//// [uncalledFunctionChecksInConditionalPerf.ts]
2+
declare const b: boolean;
3+
4+
((((((((((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b);
5+
6+
7+
//// [uncalledFunctionChecksInConditionalPerf.js]
8+
((((((((((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b);
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
=== tests/cases/compiler/uncalledFunctionChecksInConditionalPerf.ts ===
2+
declare const b: boolean;
3+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
4+
5+
((((((((((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b);
6+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
7+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
8+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
9+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
10+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
11+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
12+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
13+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
14+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
15+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
16+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
17+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
18+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
19+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
20+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
21+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
22+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
23+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
24+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
25+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
26+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
27+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
28+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
29+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
30+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
31+
>b : Symbol(b, Decl(uncalledFunctionChecksInConditionalPerf.ts, 0, 13))
32+
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
=== tests/cases/compiler/uncalledFunctionChecksInConditionalPerf.ts ===
2+
declare const b: boolean;
3+
>b : boolean
4+
5+
((((((((((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b);
6+
>((((((((((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) : boolean
7+
>(((((((((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b : boolean
8+
>(((((((((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) : boolean
9+
>((((((((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b : boolean
10+
>((((((((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) : boolean
11+
>(((((((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b : boolean
12+
>(((((((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) : boolean
13+
>((((((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b : boolean
14+
>((((((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) : boolean
15+
>(((((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b : boolean
16+
>(((((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) : boolean
17+
>((((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b : boolean
18+
>((((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) : boolean
19+
>(((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b : boolean
20+
>(((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) : boolean
21+
>((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b : boolean
22+
>((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) : boolean
23+
>(((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b : boolean
24+
>(((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) : boolean
25+
>((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b : boolean
26+
>((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) : boolean
27+
>(((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b : boolean
28+
>(((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) : boolean
29+
>((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b : boolean
30+
>((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) : boolean
31+
>(((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b : boolean
32+
>(((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) : boolean
33+
>((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b : boolean
34+
>((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) : boolean
35+
>(((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b : boolean
36+
>(((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) : boolean
37+
>((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b : boolean
38+
>((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) : boolean
39+
>(((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b : boolean
40+
>(((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) : boolean
41+
>((((((((b) && b) && b) && b) && b) && b) && b) && b) && b : boolean
42+
>((((((((b) && b) && b) && b) && b) && b) && b) && b) : boolean
43+
>(((((((b) && b) && b) && b) && b) && b) && b) && b : boolean
44+
>(((((((b) && b) && b) && b) && b) && b) && b) : boolean
45+
>((((((b) && b) && b) && b) && b) && b) && b : boolean
46+
>((((((b) && b) && b) && b) && b) && b) : boolean
47+
>(((((b) && b) && b) && b) && b) && b : boolean
48+
>(((((b) && b) && b) && b) && b) : boolean
49+
>((((b) && b) && b) && b) && b : boolean
50+
>((((b) && b) && b) && b) : boolean
51+
>(((b) && b) && b) && b : boolean
52+
>(((b) && b) && b) : boolean
53+
>((b) && b) && b : boolean
54+
>((b) && b) : boolean
55+
>(b) && b : boolean
56+
>(b) : boolean
57+
>b : boolean
58+
>b : true
59+
>b : true
60+
>b : true
61+
>b : true
62+
>b : true
63+
>b : true
64+
>b : true
65+
>b : true
66+
>b : true
67+
>b : true
68+
>b : true
69+
>b : true
70+
>b : true
71+
>b : true
72+
>b : true
73+
>b : true
74+
>b : true
75+
>b : true
76+
>b : true
77+
>b : true
78+
>b : true
79+
>b : true
80+
>b : true
81+
>b : true
82+
>b : true
83+
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// @strictNullChecks: true
2+
3+
declare const b: boolean;
4+
5+
((((((((((((((((((((((((((b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b) && b);

0 commit comments

Comments
 (0)