void (@NotNull String name, @NotNull final Processor<? super NavigationItem> processor, @NotNull final FindSymbolParameters parameters) { GlobalSearchScope scope = parameters.getSearchScope(); IdFilter filter = parameters.getIdFilter(); PsiShortNamesCache cache = PsiShortNamesCache.getInstance(scope.getProject()); String completePattern = parameters.getCompletePattern(); final Predicate<PsiMember> qualifiedMatcher = getQualifiedNameMatcher(completePattern); //noinspection UnusedDeclaration final Set<PsiMethod> collectedMethods = new HashSet<>(); boolean success = cache.processFieldsWithName(name, field -> { if (isOpenable(field) && qualifiedMatcher.test(field)) return processor.process(field); return true; }, scope, filter) && cache.processClassesWithName(name, new DefaultClassProcessor(processor, parameters, true), scope, filter) && cache.processMethodsWithName(name, method -> { if (!method.isConstructor() && isOpenable(method) && qualifiedMatcher.test(method)) { collectedMethods.add(method); } return true; }, scope, filter); if (success) { // hashSuperMethod accesses index and can not be invoked without risk of the deadlock in processMethodsWithName Iterator<PsiMethod> iterator = collectedMethods.iterator(); while (iterator.hasNext()) { PsiMethod method = iterator.next(); if (!hasSuperMethod(method, scope, qualifiedMatcher, completePattern) && !processor.process(method)) return; ProgressManager.checkCanceled(); iterator.remove(); } } }