Skip to content

Commit dd5a78b

Browse files
committed
Reuse computed type of condition expressions
1 parent 71d1911 commit dd5a78b

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
}
@@ -34692,8 +34692,8 @@ namespace ts {
3469234692
}
3469334693

3469434694
function checkConditionalExpression(node: ConditionalExpression, checkMode?: CheckMode): Type {
34695-
checkTruthinessExpression(node.condition);
34696-
checkTestingKnownTruthyCallableOrAwaitableType(node.condition, node.whenTrue);
34695+
const type = checkTruthinessExpression(node.condition);
34696+
checkTestingKnownTruthyCallableOrAwaitableType(node.condition, type, node.whenTrue);
3469734697
const type1 = checkExpression(node.whenTrue, checkMode);
3469834698
const type2 = checkExpression(node.whenFalse, checkMode);
3469934699
return getUnionType([type1, type2], UnionReduction.Subtype);
@@ -38398,8 +38398,8 @@ namespace ts {
3839838398
function checkIfStatement(node: IfStatement) {
3839938399
// Grammar checking
3840038400
checkGrammarStatementInAmbientContext(node);
38401-
checkTruthinessExpression(node.expression);
38402-
checkTestingKnownTruthyCallableOrAwaitableType(node.expression, node.thenStatement);
38401+
const type = checkTruthinessExpression(node.expression);
38402+
checkTestingKnownTruthyCallableOrAwaitableType(node.expression, type, node.thenStatement);
3840338403
checkSourceElement(node.thenStatement);
3840438404

3840538405
if (node.thenStatement.kind === SyntaxKind.EmptyStatement) {
@@ -38409,7 +38409,7 @@ namespace ts {
3840938409
checkSourceElement(node.elseStatement);
3841038410
}
3841138411

38412-
function checkTestingKnownTruthyCallableOrAwaitableType(condExpr: Expression, body?: Statement | Expression) {
38412+
function checkTestingKnownTruthyCallableOrAwaitableType(condExpr: Expression, condType: Type, body?: Statement | Expression) {
3841338413
if (!strictNullChecks) return;
3841438414

3841538415
helper(condExpr, body);
@@ -38424,7 +38424,7 @@ namespace ts {
3842438424
? condExpr.right
3842538425
: condExpr;
3842638426
if (isModuleExportsAccessExpression(location)) return;
38427-
const type = checkTruthinessExpression(location);
38427+
const type = location === condExpr ? condType : checkTruthinessExpression(location);
3842838428
const isPropertyExpressionCast = isPropertyAccessExpression(location) && isTypeAssertion(location.expression);
3842938429
if (!(getTypeFacts(type) & TypeFacts.Truthy) || isPropertyExpressionCast) return;
3843038430

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)