void (LookupElement element, LookupElementPresentation presentation) { boolean shouldSkip = shouldSkip(element); presentation.freeze(); element.putUserData(DEFAULT_PRESENTATION, presentation); CompletionSorterImpl sorter = obtainSorter(element); ProcessingContext context = createContext(); Classifier<LookupElement> classifier = myClassifiers.computeIfAbsent(sorter, s -> s.buildClassifier(new EmptyClassifier())); classifier.addElement(element, context); boolean batchUpdate = Boolean.TRUE.equals(isInBatchUpdate.get()); if (batchUpdate) { synchronized (this) { if (shouldSkip) { mySkippedItems.add(element); } batchItems.add(new Pair<>(element, presentation)); } } else { synchronized (this) { if (shouldSkip) { mySkippedItems.add(element); } super.addElement(element, presentation); } trimToLimit(context); } }