diff --git a/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsXmlWrapper.java b/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsXmlWrapper.java index 3db99873541d..f45a0cf4a009 100644 --- a/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsXmlWrapper.java +++ b/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsXmlWrapper.java @@ -40,6 +40,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.vcs.FileStatusListener; @@ -246,11 +247,11 @@ public class BreadcrumbsXmlWrapper extends JComponent implements Disposable { return provider == null ? defaultProvider : provider; } - private static PsiElement[] toPsiElementArray(Collection items) { - final PsiElement[] elements = new PsiElement[items.size()]; + private static PsiElement[] toPsiElementArray(Collection> pairs) { + PsiElement[] elements = new PsiElement[pairs.size()]; int index = 0; - for (PsiCrumb item : items) { - elements[index++] = item.anchor.retrieve(); + for (Pair pair : pairs) { + elements[index++] = pair.first; } return elements; } @@ -276,18 +277,20 @@ public class BreadcrumbsXmlWrapper extends JComponent implements Disposable { final Editor editor, final Project project, final BreadcrumbsProvider defaultInfoProvider) { - final LinkedList result = + Collection> pairs = getLineElements(editor.logicalPositionToOffset(position), file, project, defaultInfoProvider); - if (result == null) return null; + if (pairs == null) return null; - final PsiElement[] elements = toPsiElementArray(result); - final CrumbPresentation[] presentations = getCrumbPresentations(elements); - if (presentations != null) { - int i = 0; - for (PsiCrumb item : result) { - item.presentation = presentations[i++]; + ArrayList result = new ArrayList<>(pairs.size()); + CrumbPresentation[] presentations = getCrumbPresentations(toPsiElementArray(pairs)); + int index = 0; + for (Pair pair : pairs) { + PsiCrumb crumb = new PsiCrumb(pair.first, pair.second); + if (presentations != null && 0 <= index && index < presentations.length) { + crumb.presentation = presentations[index++]; } + result.add(crumb); } return result; @@ -295,24 +298,24 @@ public class BreadcrumbsXmlWrapper extends JComponent implements Disposable { @Nullable public static PsiElement[] getLinePsiElements(int offset, VirtualFile file, Project project, BreadcrumbsProvider infoProvider) { - final LinkedList lineElements = getLineElements(offset, file, project, infoProvider); - return lineElements != null ? toPsiElementArray(lineElements) : null; + Collection> pairs = getLineElements(offset, file, project, infoProvider); + return pairs == null ? null : toPsiElementArray(pairs); } @Nullable - private static LinkedList getLineElements(final int offset, - VirtualFile file, - Project project, - BreadcrumbsProvider defaultInfoProvider) { + private static Collection> getLineElements(int offset, + VirtualFile file, + Project project, + BreadcrumbsProvider defaultInfoProvider) { PsiElement element = findFirstBreadcrumbedElement(offset, file, project, defaultInfoProvider); if (element == null) return null; - final LinkedList result = new LinkedList<>(); + LinkedList> result = new LinkedList<>(); while (element != null) { BreadcrumbsProvider provider = findProviderForElement(element, defaultInfoProvider); if (provider != null && provider.acceptElement(element)) { - result.addFirst(new PsiCrumb(element, provider)); + result.addFirst(Pair.create(element, provider)); } element = getParent(element, provider); diff --git a/xml/impl/src/com/intellij/xml/breadcrumbs/PsiCrumb.java b/xml/impl/src/com/intellij/xml/breadcrumbs/PsiCrumb.java index 685ea013097a..b26ff45539d9 100644 --- a/xml/impl/src/com/intellij/xml/breadcrumbs/PsiCrumb.java +++ b/xml/impl/src/com/intellij/xml/breadcrumbs/PsiCrumb.java @@ -19,12 +19,13 @@ import com.intellij.psi.PsiAnchor; import com.intellij.psi.PsiElement; import com.intellij.ui.breadcrumbs.BreadcrumbsProvider; import com.intellij.ui.components.breadcrumbs.Crumb; +import org.jetbrains.annotations.Nullable; /** * @author Sergey.Malenkov */ final class PsiCrumb extends Crumb.Impl { - final PsiAnchor anchor; + private final PsiAnchor anchor; CrumbPresentation presentation; PsiCrumb(PsiElement element, BreadcrumbsProvider provider) { @@ -32,10 +33,12 @@ final class PsiCrumb extends Crumb.Impl { anchor = PsiAnchor.create(element); } + @Nullable static PsiElement getElement(Crumb crumb) { return crumb instanceof PsiCrumb ? ((PsiCrumb)crumb).anchor.retrieve() : null; } + @Nullable static CrumbPresentation getPresentation(Crumb crumb) { return crumb instanceof PsiCrumb ? ((PsiCrumb)crumb).presentation : null; }