use of org.dartlang.analysis.server.protocol.TypeHierarchyItem in project intellij-plugins by JetBrains.
the class DartInheritorsSearcher method addSubMembers.
private static void addSubMembers(@NotNull final Project project, @NotNull final SearchScope scope, @NotNull final Set<TypeHierarchyItem> visited, @NotNull final List<TypeHierarchyItem> hierarchyItems, @NotNull final List<DartComponent> components, @NotNull final TypeHierarchyItem currentItem, final boolean addItem) {
if (!visited.add(currentItem)) {
return;
}
if (addItem) {
final Element element = currentItem.getMemberElement();
if (element != null) {
final Location location = element.getLocation();
final DartComponent component = DartHierarchyUtil.findDartComponent(project, location);
if (component != null && isInScope(scope, component)) {
components.add(component);
}
}
}
for (int subIndex : currentItem.getSubclasses()) {
final TypeHierarchyItem subItem = hierarchyItems.get(subIndex);
addSubMembers(project, scope, visited, hierarchyItems, components, subItem, true);
}
}
use of org.dartlang.analysis.server.protocol.TypeHierarchyItem in project intellij-plugins by JetBrains.
the class DartServerImplementationsMarkerProvider method createMarkerMember.
@NotNull
private static LineMarkerInfo createMarkerMember(@NotNull final DartComponentName name) {
final VirtualFile file = name.getContainingFile().getVirtualFile();
final int nameOffset = name.getTextRange().getStartOffset();
return new LineMarkerInfo<>(name, name.getTextRange(), AllIcons.Gutter.OverridenMethod, Pass.LINE_MARKERS, element -> DaemonBundle.message("method.is.overridden.too.many"), (GutterIconNavigationHandler<PsiElement>) (e, elt) -> {
final List<TypeHierarchyItem> items = DartAnalysisServerService.getInstance(name.getProject()).search_getTypeHierarchy(file, nameOffset, false);
if (items.isEmpty()) {
return;
}
final List<DartComponent> components = DartInheritorsSearcher.getSubMembers(name.getProject(), GlobalSearchScope.allScope(name.getProject()), items);
PsiElementListNavigator.openTargets(e, DartResolveUtil.getComponentNameArray(components), DaemonBundle.message("navigation.title.overrider.method", name.getName(), components.size()), "Overriding methods of " + name.getName(), new DefaultPsiElementCellRenderer());
}, GutterIconRenderer.Alignment.RIGHT);
}
use of org.dartlang.analysis.server.protocol.TypeHierarchyItem in project intellij-plugins by JetBrains.
the class DartServerImplementationsMarkerProvider method createMarkerClass.
@NotNull
private static LineMarkerInfo createMarkerClass(@NotNull final DartComponentName name) {
final VirtualFile file = name.getContainingFile().getVirtualFile();
final int nameOffset = name.getTextRange().getStartOffset();
return new LineMarkerInfo<>(name, name.getTextRange(), AllIcons.Gutter.OverridenMethod, Pass.LINE_MARKERS, element -> DaemonBundle.message("class.is.subclassed.too.many"), (GutterIconNavigationHandler<PsiElement>) (e, elt) -> {
final List<TypeHierarchyItem> items = DartAnalysisServerService.getInstance(name.getProject()).search_getTypeHierarchy(file, nameOffset, false);
if (items.isEmpty()) {
return;
}
final List<DartComponent> components = DartInheritorsSearcher.getSubClasses(name.getProject(), GlobalSearchScope.allScope(name.getProject()), items);
PsiElementListNavigator.openTargets(e, DartResolveUtil.getComponentNameArray(components), DaemonBundle.message("navigation.title.subclass", name.getName(), components.size(), ""), "Subclasses of " + name.getName(), new DefaultPsiElementCellRenderer());
}, GutterIconRenderer.Alignment.RIGHT);
}
use of org.dartlang.analysis.server.protocol.TypeHierarchyItem in project intellij-plugins by JetBrains.
the class DartMethodHierarchyTreeStructure method addAllVisibleSubclasses.
private void addAllVisibleSubclasses(@NotNull final Set<TypeHierarchyItem> stackItems, @NotNull final Project project, @NotNull final List<TypeHierarchyItem> items, @NotNull final TypeHierarchyItem item, @NotNull final DartMethodHierarchyNodeDescriptor descriptor) {
if (!stackItems.add(item)) {
descriptor.setCachedChildren(ArrayUtil.EMPTY_OBJECT_ARRAY);
return;
}
HierarchyBrowserManager.State state = HierarchyBrowserManager.getInstance(myProject).getState();
if (state == null)
throw new NullPointerException();
List<DartMethodHierarchyNodeDescriptor> subDescriptors = Lists.newArrayList();
try {
for (int index : item.getSubclasses()) {
final TypeHierarchyItem subItem = items.get(index);
final DartClass subclass = findDartClass(project, subItem);
if (subclass != null) {
final DartMethodHierarchyNodeDescriptor subDescriptor = new DartMethodHierarchyNodeDescriptor(project, descriptor, subclass, false, this);
subDescriptors.add(subDescriptor);
addAllVisibleSubclasses(stackItems, project, items, subItem, subDescriptor);
}
}
DartClass dartClass = findDartClass(project, item);
assert dartClass != null;
String methodName = getBaseMethod().getName();
if (methodName != null) {
DartComponent method = dartClass.findMethodByName(methodName);
if (method != null) {
DartClass definingClass = PsiTreeUtil.getParentOfType(method, DartClass.class);
if (definingClass == dartClass) {
descriptor.myIsImplementor = true;
} else {
descriptor.myShouldImplement = method.isAbstract() && !dartClass.isAbstract();
}
}
}
for (DartMethodHierarchyNodeDescriptor subDescriptor : subDescriptors) {
if (subDescriptor.myIsSuperclassOfImplementor || subDescriptor.myIsImplementor) {
descriptor.myIsSuperclassOfImplementor = true;
break;
}
}
if (state.HIDE_CLASSES_WHERE_METHOD_NOT_IMPLEMENTED) {
List<DartMethodHierarchyNodeDescriptor> toRemove = Lists.newArrayList();
for (DartMethodHierarchyNodeDescriptor subDescriptor : subDescriptors) {
if (!(subDescriptor.myIsSuperclassOfImplementor || subDescriptor.myIsImplementor)) {
toRemove.add(subDescriptor);
}
}
subDescriptors.removeAll(toRemove);
}
} finally {
stackItems.remove(item);
}
descriptor.setCachedChildren(subDescriptors.toArray(new HierarchyNodeDescriptor[subDescriptors.size()]));
}
use of org.dartlang.analysis.server.protocol.TypeHierarchyItem in project intellij-plugins by JetBrains.
the class DartMethodHierarchyTreeStructure method buildChildren.
@NotNull
@Override
protected Object[] buildChildren(@NotNull HierarchyNodeDescriptor descript) {
final DartMethodHierarchyNodeDescriptor descriptor = (DartMethodHierarchyNodeDescriptor) descript;
final DartClass dartClass = descriptor.getType();
if (dartClass == null)
return ArrayUtil.EMPTY_OBJECT_ARRAY;
final List<TypeHierarchyItem> items = getTypeHierarchyItems(dartClass);
if (items.isEmpty())
return ArrayUtil.EMPTY_OBJECT_ARRAY;
addAllVisibleSubclasses(Sets.newHashSet(), myProject, items, items.get(0), descriptor);
return descriptor.getCachedChildren();
}
Aggregations