@@ -30169,13 +30169,22 @@ namespace ts {
30169
30169
30170
30170
function checkExpression(node: Expression | QualifiedName, checkMode?: CheckMode, forceTuple?: boolean): Type {
30171
30171
const saveCurrentNode = currentNode;
30172
+ const oldTypeCount = typeCount;
30173
+ const oldSymbolCount = symbolCount;
30174
+
30172
30175
currentNode = node;
30173
30176
instantiationCount = 0;
30174
30177
const uninstantiatedType = checkExpressionWorker(node, checkMode, forceTuple);
30175
30178
const type = instantiateTypeWithSingleGenericCallSignature(node, uninstantiatedType, checkMode);
30176
30179
if (isConstEnumObjectType(type)) {
30177
30180
checkConstEnumAccess(node, type);
30178
30181
}
30182
+
30183
+ insertExpensiveStatement({
30184
+ node,
30185
+ typeDelta: typeCount - oldTypeCount,
30186
+ symbolDelta: symbolCount - oldSymbolCount,
30187
+ });
30179
30188
currentNode = saveCurrentNode;
30180
30189
return type;
30181
30190
}
@@ -35667,45 +35676,49 @@ namespace ts {
35667
35676
35668
35677
checkSourceElementWorker(node);
35669
35678
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
+ });
35678
35684
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
+ }
35686
35688
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;
35706
35701
}
35702
+ i++;
35703
+ }
35707
35704
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
+ }
35709
35722
}
35710
35723
}
35711
35724
0 commit comments