@NotNull
  @Override
  public Collection<StructureViewTreeElement> getChildrenBase() {
    final NavigatablePsiElement element = getElement();
    final List<StructureViewTreeElement> result = new ArrayList<StructureViewTreeElement>();

    if (element instanceof DartFile || element instanceof DartEmbeddedContent) {
      THashSet<DartComponentName> componentNames = new THashSet<DartComponentName>();
      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,
        new Comparator<StructureViewTreeElement>() {
          @Override
          public int compare(StructureViewTreeElement o1, StructureViewTreeElement 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;
  }