From edc62cbf0f75274cc47d0c3b22a122701d979cf2 Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Mon, 19 Jul 2021 17:08:26 +0200 Subject: [PATCH] [project view] compute tree structure data from selection in slow provider ``` ... at com.intellij.ide.projectView.impl.nodes.PsiTreeAnchorizer.retrieveElement(PsiTreeAnchorizer.java:48) at com.intellij.ide.util.treeView.AbstractTreeNode.getValue(AbstractTreeNode.java:150) at com.intellij.lang.properties.projectView.ResourceBundleGrouper.getData(ResourceBundleGrouper.java:105) at com.intellij.ide.util.treeView.AbstractTreeStructureBase.getDataFromProviders(AbstractTreeStructureBase.java:93) at com.intellij.ide.projectView.impl.AbstractProjectViewPane.getData(AbstractProjectViewPane.java:376) ... ``` GitOrigin-RevId: 6189cc40b386ac7e469c6558a357058ff45a092d --- .../impl/AbstractProjectViewPane.java | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/AbstractProjectViewPane.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/AbstractProjectViewPane.java index 0051d5bae429..18e2c89e3aa4 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/AbstractProjectViewPane.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/AbstractProjectViewPane.java @@ -371,15 +371,6 @@ public abstract class AbstractProjectViewPane implements DataProvider, Disposabl public Object getData(@NotNull String dataId) { if (PlatformDataKeys.TREE_EXPANDER.is(dataId)) return getTreeExpander(); - if (myTreeStructure instanceof AbstractTreeStructureBase) { - @SuppressWarnings("unchecked") - List> nodes = (List)getSelectedNodes(AbstractTreeNode.class); - Object data = ((AbstractTreeStructureBase)myTreeStructure).getDataFromProviders(nodes, dataId); - if (data != null) { - return data; - } - } - if (CommonDataKeys.NAVIGATABLE_ARRAY.is(dataId)) { TreePath[] paths = getSelectionPaths(); if (paths == null) return null; @@ -454,6 +445,10 @@ public abstract class AbstractProjectViewPane implements DataProvider, Disposabl @RequiresReadLock(generateAssertion = false) @RequiresBackgroundThread(generateAssertion = false) private @Nullable Object getDataFromSelection(@Nullable Object @NotNull [] selectedUserObjects, @NotNull String dataId) { + Object treeStructureData = getFromTreeStructure(selectedUserObjects, dataId); + if (treeStructureData != null) { + return treeStructureData; + } if (CommonDataKeys.PSI_ELEMENT.is(dataId)) { final PsiElement[] elements = getPsiElements(selectedUserObjects); return elements.length == 1 ? elements[0] : null; @@ -473,6 +468,19 @@ public abstract class AbstractProjectViewPane implements DataProvider, Disposabl return null; } + private @Nullable Object getFromTreeStructure(@Nullable Object @NotNull [] selectedUserObjects, @NotNull String dataId) { + if (!(myTreeStructure instanceof AbstractTreeStructureBase)) { + return null; + } + List> nodes = new ArrayList<>(selectedUserObjects.length); + for (Object userObject : selectedUserObjects) { + if (userObject instanceof AbstractTreeNode) { + nodes.add((AbstractTreeNode)userObject); + } + } + return ((AbstractTreeStructureBase)myTreeStructure).getDataFromProviders(nodes, dataId); + } + @RequiresReadLock(generateAssertion = false) @RequiresBackgroundThread(generateAssertion = false) private @NotNull PsiElement @NotNull [] getPsiElements(@Nullable Object @NotNull [] selectedUserObjects) {