package com.jetbrains.lang.dart.ide.structure; import com.intellij.ide.structureView.StructureViewTreeElement; import com.intellij.ide.structureView.impl.common.PsiTreeElementBase; import com.intellij.navigation.ItemPresentation; import com.intellij.psi.NavigatablePsiElement; import com.intellij.psi.PsiElement; import com.intellij.psi.ResolveState; import com.jetbrains.lang.dart.psi.*; import com.jetbrains.lang.dart.psi.impl.DartPsiCompositeElementImpl; import com.jetbrains.lang.dart.resolve.ComponentNameScopeProcessor; import com.jetbrains.lang.dart.util.DartResolveUtil; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; public class DartStructureViewElement extends PsiTreeElementBase<NavigatablePsiElement> implements ItemPresentation, StructureViewTreeElement { public DartStructureViewElement(@NotNull final NavigatablePsiElement element) { super(element); } @NotNull @Override public Collection<StructureViewTreeElement> getChildrenBase() { final NavigatablePsiElement element = getElement(); final List<StructureViewTreeElement> result = new ArrayList<>(); if (element instanceof DartFile || element instanceof DartEmbeddedContent) { THashSet<DartComponentName> componentNames = new THashSet<>(); DartPsiCompositeElementImpl .processDeclarationsImpl(element, new ComponentNameScopeProcessor(componentNames), ResolveState.initial(), null); for (DartComponentName componentName : componentNames) { PsiElement parent = componentName.getParent(); if (parent instanceof DartComponent) { result.add(new DartStructureViewElement((DartComponent)parent)); } } } else if (element instanceof DartClass) { for (DartComponent subNamedComponent : DartResolveUtil.getNamedSubComponents((DartClass)element)) { result.add(new DartStructureViewElement(subNamedComponent)); } } Collections.sort(result, (o1, o2) -> { PsiElement element1, element2; if (o1 instanceof DartStructureViewElement && o2 instanceof DartStructureViewElement && (element1 = ((DartStructureViewElement)o1).getElement()) != null && (element2 = ((DartStructureViewElement)o2).getElement()) != null) { return element1.getTextRange().getStartOffset() - element2.getTextRange().getStartOffset(); } return 0; }); return result; } @Nullable @Override public String getPresentableText() { final NavigatablePsiElement element = getElement(); final ItemPresentation presentation = element == null ? null : element.getPresentation(); return presentation == null ? null : presentation.getPresentableText(); } }