[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
This commit is contained in:
Daniil Ovchinnikov
2021-07-19 16:16:53 +00:00
committed by intellij-monorepo-bot
parent bf70f87bf1
commit edc62cbf0f
@@ -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<AbstractTreeNode<?>> 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<AbstractTreeNode<?>> 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) {