package com.intellij.lang.javascript.uml;
import com.intellij.diagram.extras.providers.ImplementationsProvider;
import com.intellij.lang.javascript.JSBundle;
import com.intellij.lang.javascript.search.JSClassSearch;
import com.intellij.lang.javascript.psi.ecmal4.JSClass;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.util.Processor;
import gnu.trove.THashSet;
import java.util.Collections;
import java.util.Comparator;
import java.util.Collection;
public class FlashUmlImplementationsProvider extends ImplementationsProvider<Object> {
public Object[] getElements(Object element, Project project) {
JSClass clazz = (JSClass)element;
final Collection<PsiElement> inheritors = Collections.synchronizedSet(new THashSet<PsiElement>());
final Processor<JSClass> p = aClass -> {
final PsiElement navigationElement = aClass.getNavigationElement();
inheritors.add(navigationElement instanceof JSClass ? navigationElement : aClass);
return true;
};
JSClassSearch.searchClassInheritors(clazz, true).forEach(p);
if (clazz.isInterface()) {
JSClassSearch.searchInterfaceImplementations(clazz, true).forEach(p);
}
return inheritors.toArray(new PsiElement[inheritors.size()]);
}
public boolean isEnabledOn(Object element) {
return element instanceof JSClass;
}
public String getHeaderName(Object element, Project project) {
return JSBundle.message("javascript.uml.show.implementations.header", ((JSClass)element).getName());
}
public Comparator<Object> getComparator() {
return (o1, o2) -> PSI_COMPARATOR.compare((PsiElement)o1, (PsiElement)o2);
}
}