void (final Set<? extends PyFunction> functions, final Collection<? super LineMarkerInfo<?>> result) { Set<PyClass> classes = new HashSet<>(); final MultiMap<PyClass, PyFunction> candidates = new MultiMap<>(); for (PyFunction function : functions) { PyClass pyClass = function.getContainingClass(); if (pyClass != null && function.getName() != null) { classes.add(pyClass); candidates.putValue(pyClass, function); } } final Set<PyFunction> overridden = new HashSet<>(); for (final PyClass pyClass : classes) { PyClassInheritorsSearch.search(pyClass, true).forEach(inheritor -> { for (Iterator<PyFunction> it = candidates.get(pyClass).iterator(); it.hasNext(); ) { PyFunction func = it.next(); if (inheritor.findMethodByName(func.getName(), false, null) != null) { overridden.add(func); it.remove(); } } return !candidates.isEmpty(); }); if (candidates.isEmpty()) break; } for (PyFunction func : overridden) { PsiElement identifier = func.getNameIdentifier(); if (identifier != null) { result.add(new LineMarkerInfo<>(identifier, identifier.getTextRange(), AllIcons.Gutter.OverridenMethod, ourOverridingMethodTooltipProvider, ourOverridingMethodNavigator, GutterIconRenderer.Alignment.RIGHT)); } } }