73b608608a
PendingDiagnosticsCollectorWithSuppress is a special diagnostic collector, which aggregates diagnostics reported during checking of some specific element before actually reporting them, so its workflow looks like this: - start checking some element; - all reported diagnostics go to `pendingDiagnosticsByFilePath` map; - all checkers done their jobs; - diagnostics from `pendingDiagnosticsByFilePath` go to the resulting map of all diagnostics (not all, only ones which lay inside the checked according to PSI); - processed diagnostics removed from `pendingDiagnosticsByFilePath` This approach works fine, but there was one problem with it: `pendingDiagnosticsByFilePath` is not just a list of diagnostic, but map of lists, grouped by the containing file. And only those lists actually get cleared. But if some list was completely emptied, it still remained in the original `pendingDiagnosticsByFilePath` map This led to the performance problem in case, where there are no actual diagnostics in the `pendingDiagnosticsByFilePath`, but the map itself is not empty but full of empty lists. So collector iterated over this map on each visiting of each element And after KT-58881 this problem was uncovered, as number of visits of elements was twiced (because now we iterate over the whole tree twice, with Common and Platform checkers) The fix is quite trivial -- if some list in `pendingDiagnosticsByFilePath` becomes empty, remove it from the map ^KT-65579 Fixed