@@ -315,6 +315,16 @@ namespace ts {
315
315
let constraintDepth = 0;
316
316
let currentNode: Node | undefined;
317
317
318
+ interface ExpensiveStatement {
319
+ node: Node;
320
+ typeDelta: number;
321
+ symbolDelta: number;
322
+ }
323
+
324
+ let ignoreExpensiveStatement = true;
325
+ const maxExpensiveStatementCount = 5;
326
+ const expensiveStatements: ExpensiveStatement[] = [];
327
+
318
328
const emptySymbols = createSymbolTable();
319
329
const arrayVariances = [VarianceFlags.Covariant];
320
330
@@ -34863,7 +34873,39 @@ namespace ts {
34863
34873
const saveCurrentNode = currentNode;
34864
34874
currentNode = node;
34865
34875
instantiationCount = 0;
34876
+
34877
+ const oldTypeCount = typeCount;
34878
+ const oldSymbolCount = symbolCount;
34879
+
34866
34880
checkSourceElementWorker(node);
34881
+
34882
+ if (node.kind >= SyntaxKind.FirstStatement && node.kind <= SyntaxKind.LastStatement) {
34883
+ if (ignoreExpensiveStatement) {
34884
+ // The first statement is unfairly blamed for a lot of lib types
34885
+ ignoreExpensiveStatement = false;
34886
+ }
34887
+ else {
34888
+ const typeDelta = typeCount - oldTypeCount;
34889
+ const symbolDelta = symbolCount - oldSymbolCount;
34890
+ const record = { node, typeDelta, symbolDelta };
34891
+
34892
+ let i = 0;
34893
+ for (const record of expensiveStatements) {
34894
+ if (record.typeDelta < typeDelta) {
34895
+ break;
34896
+ }
34897
+ i++;
34898
+ }
34899
+
34900
+ if (i < maxExpensiveStatementCount) {
34901
+ expensiveStatements.splice(i, 0, record);
34902
+ if (expensiveStatements.length > maxExpensiveStatementCount) {
34903
+ expensiveStatements.pop();
34904
+ }
34905
+ }
34906
+ }
34907
+ }
34908
+
34867
34909
currentNode = saveCurrentNode;
34868
34910
}
34869
34911
}
0 commit comments