Skip to content

Commit 9d24de1

Browse files
committed
Add experimental support for expensive expressions
1 parent 906c503 commit 9d24de1

File tree

1 file changed

+48
-35
lines changed

1 file changed

+48
-35
lines changed

src/compiler/checker.ts

+48-35
Original file line numberDiff line numberDiff line change
@@ -30169,13 +30169,22 @@ namespace ts {
3016930169

3017030170
function checkExpression(node: Expression | QualifiedName, checkMode?: CheckMode, forceTuple?: boolean): Type {
3017130171
const saveCurrentNode = currentNode;
30172+
const oldTypeCount = typeCount;
30173+
const oldSymbolCount = symbolCount;
30174+
3017230175
currentNode = node;
3017330176
instantiationCount = 0;
3017430177
const uninstantiatedType = checkExpressionWorker(node, checkMode, forceTuple);
3017530178
const type = instantiateTypeWithSingleGenericCallSignature(node, uninstantiatedType, checkMode);
3017630179
if (isConstEnumObjectType(type)) {
3017730180
checkConstEnumAccess(node, type);
3017830181
}
30182+
30183+
insertExpensiveStatement({
30184+
node,
30185+
typeDelta: typeCount - oldTypeCount,
30186+
symbolDelta: symbolCount - oldSymbolCount,
30187+
});
3017930188
currentNode = saveCurrentNode;
3018030189
return type;
3018130190
}
@@ -35667,45 +35676,49 @@ namespace ts {
3566735676

3566835677
checkSourceElementWorker(node);
3566935678

35670-
// Never report expensive statements in .d.ts files
35671-
if (!checkingDtsFile && maxExpensiveStatementCount > 0) {
35672-
if (node.kind >= SyntaxKind.FirstStatement && node.kind <= SyntaxKind.LastStatement ||
35673-
node.kind === SyntaxKind.TypeAliasDeclaration ||
35674-
node.kind === SyntaxKind.InterfaceDeclaration) {
35675-
const typeDelta = typeCount - oldTypeCount;
35676-
const symbolDelta = symbolCount - oldSymbolCount;
35677-
const record = { node, typeDelta, symbolDelta };
35679+
insertExpensiveStatement({
35680+
node,
35681+
typeDelta: typeCount - oldTypeCount,
35682+
symbolDelta: symbolCount - oldSymbolCount,
35683+
});
3567835684

35679-
let i = 0;
35680-
for (const record of expensiveStatements) {
35681-
if (record.typeDelta < typeDelta) {
35682-
break;
35683-
}
35684-
i++;
35685-
}
35685+
currentNode = saveCurrentNode;
35686+
}
35687+
}
3568635688

35687-
if (i < maxExpensiveStatementCount) {
35688-
let hasExpensiveDescendent = false;
35689-
// Search forward since descendants cannot be more expensive
35690-
for (let j = i; j < expensiveStatements.length; j++) {
35691-
const candidate = expensiveStatements[j];
35692-
if (isNodeDescendantOf(candidate.node, record.node)) {
35693-
// A node that isn't at least 50% more expensive than one of its descendants isn't interesting
35694-
hasExpensiveDescendent = (record.typeDelta / candidate.typeDelta) < 1.5;
35695-
break; // Stop looking since all subsequent nodes are less expensive
35696-
}
35697-
}
35698-
if (!hasExpensiveDescendent) {
35699-
expensiveStatements.splice(i, 0, record);
35700-
if (expensiveStatements.length > maxExpensiveStatementCount) {
35701-
expensiveStatements.pop();
35702-
}
35703-
}
35704-
}
35705-
}
35689+
function insertExpensiveStatement(record: ExpensiveStatement): void {
35690+
// Never report expensive statements in .d.ts files
35691+
if (checkingDtsFile || maxExpensiveStatementCount <= 0) {
35692+
return;
35693+
}
35694+
35695+
let i = 0;
35696+
for (const existing of expensiveStatements) {
35697+
// The = is important - we need to insert record before its
35698+
// descendants for the de-duping logic to work correctly.
35699+
if (existing.typeDelta <= record.typeDelta) {
35700+
break;
3570635701
}
35702+
i++;
35703+
}
3570735704

35708-
currentNode = saveCurrentNode;
35705+
if (i < maxExpensiveStatementCount) {
35706+
let hasExpensiveDescendent = false;
35707+
// Search forward since descendants cannot be more expensive
35708+
for (let j = i; j < expensiveStatements.length; j++) {
35709+
const candidate = expensiveStatements[j];
35710+
if (isNodeDescendantOf(candidate.node, record.node)) {
35711+
// If a single descendant makes up the majority of the cost, this node isn't interesting
35712+
hasExpensiveDescendent = (record.typeDelta / candidate.typeDelta) < 2
35713+
break; // Stop looking since all subsequent nodes are less expensive
35714+
}
35715+
}
35716+
if (!hasExpensiveDescendent) {
35717+
expensiveStatements.splice(i, 0, record);
35718+
if (expensiveStatements.length > maxExpensiveStatementCount) {
35719+
expensiveStatements.pop();
35720+
}
35721+
}
3570935722
}
3571035723
}
3571135724

0 commit comments

Comments
 (0)