@@ -317,6 +317,16 @@ namespace ts {
317
317
let constraintDepth = 0;
318
318
let currentNode: Node | undefined;
319
319
320
+ interface ExpensiveStatement {
321
+ node: Node;
322
+ typeDelta: number;
323
+ symbolDelta: number;
324
+ }
325
+
326
+ let ignoreExpensiveStatement = true;
327
+ const maxExpensiveStatementCount = 5;
328
+ const expensiveStatements: ExpensiveStatement[] = [];
329
+
320
330
const emptySymbols = createSymbolTable();
321
331
const arrayVariances = [VarianceFlags.Covariant];
322
332
@@ -35619,7 +35629,39 @@ namespace ts {
35619
35629
const saveCurrentNode = currentNode;
35620
35630
currentNode = node;
35621
35631
instantiationCount = 0;
35632
+
35633
+ const oldTypeCount = typeCount;
35634
+ const oldSymbolCount = symbolCount;
35635
+
35622
35636
checkSourceElementWorker(node);
35637
+
35638
+ if (node.kind >= SyntaxKind.FirstStatement && node.kind <= SyntaxKind.LastStatement) {
35639
+ if (ignoreExpensiveStatement) {
35640
+ // The first statement is unfairly blamed for a lot of lib types
35641
+ ignoreExpensiveStatement = false;
35642
+ }
35643
+ else {
35644
+ const typeDelta = typeCount - oldTypeCount;
35645
+ const symbolDelta = symbolCount - oldSymbolCount;
35646
+ const record = { node, typeDelta, symbolDelta };
35647
+
35648
+ let i = 0;
35649
+ for (const record of expensiveStatements) {
35650
+ if (record.typeDelta < typeDelta) {
35651
+ break;
35652
+ }
35653
+ i++;
35654
+ }
35655
+
35656
+ if (i < maxExpensiveStatementCount) {
35657
+ expensiveStatements.splice(i, 0, record);
35658
+ if (expensiveStatements.length > maxExpensiveStatementCount) {
35659
+ expensiveStatements.pop();
35660
+ }
35661
+ }
35662
+ }
35663
+ }
35664
+
35623
35665
currentNode = saveCurrentNode;
35624
35666
}
35625
35667
}
0 commit comments