Honor node providers when building navbar from structure (IDEA-231342)

GitOrigin-RevId: 3e2322ff7ee747ed016423835682052acb966a67
This commit is contained in:
Dmitry Jemerov
2020-01-28 15:42:16 +01:00
committed by intellij-monorepo-bot
parent dafad04681
commit 2713fd1432
4 changed files with 41 additions and 6 deletions

View File

@@ -1,8 +1,12 @@
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.ide.navigationToolbar;
import com.google.common.collect.ImmutableList;
import com.intellij.analysis.AnalysisScopeBundle;
import com.intellij.ide.structureView.impl.java.JavaAnonymousClassesNodeProvider;
import com.intellij.ide.structureView.impl.java.JavaLambdaNodeProvider;
import com.intellij.ide.ui.UISettings;
import com.intellij.ide.util.treeView.smartTree.NodeProvider;
import com.intellij.lang.LangBundle;
import com.intellij.lang.Language;
import com.intellij.lang.java.JavaLanguage;
@@ -17,12 +21,16 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
import java.util.List;
import static com.intellij.psi.util.PsiFormatUtilBase.*;
/**
* @author anna
*/
public class JavaNavBarExtension extends StructureAwareNavBarModelExtension {
private final List<NodeProvider<?>> myNodeProviders = ImmutableList.of(new JavaLambdaNodeProvider(), new JavaAnonymousClassesNodeProvider());
@Nullable
@Override
public String getPresentableText(Object object) {
@@ -47,6 +55,9 @@ public class JavaNavBarExtension extends StructureAwareNavBarModelExtension {
else if (object instanceof PsiDirectory && JrtFileSystem.isRoot(((PsiDirectory)object).getVirtualFile())) {
return LangBundle.message("jrt.node.short");
}
else if (object instanceof PsiLambdaExpression) {
return "Lambda";
}
return null;
}
@@ -95,4 +106,10 @@ public class JavaNavBarExtension extends StructureAwareNavBarModelExtension {
protected Language getLanguage() {
return JavaLanguage.INSTANCE;
}
@NotNull
@Override
protected List<NodeProvider<?>> getApplicableNodeProviders() {
return myNodeProviders;
}
}

View File

@@ -0,0 +1,5 @@
class LambdaExpression {
public void foo() {
new ArrayList<String>().forEach((x) -> System.out.<caret>println(x));
}
}

View File

@@ -27,6 +27,11 @@ public class JavaNavBarTest extends LightJavaCodeInsightFixtureTestCase {
assertNavBarModel("src", "EnumMember", "BAR", "foo");
}
public void testLambdaExpression() {
myFixture.configureByFile("lambdaExpression.java");
assertNavBarModel("src", "LambdaExpression", "foo", "Lambda");
}
public void assertNavBarModel(String... expectedItems) {
NavBarModel model = new NavBarModel(myFixture.getProject());
model.updateModel(((EditorEx)myFixture.getEditor()).getDataContext());
@@ -34,6 +39,6 @@ public class JavaNavBarTest extends LightJavaCodeInsightFixtureTestCase {
for (int i = 0; i < model.size(); i++) {
items.add(NavBarPresentation.calcPresentableText(model.get(i), false));
}
assertSameElements(items, expectedItems);
assertOrderedEquals(items, expectedItems);
}
}

View File

@@ -5,6 +5,8 @@ import com.intellij.ide.structureView.StructureViewModel
import com.intellij.ide.structureView.StructureViewTreeElement
import com.intellij.ide.structureView.TreeBasedStructureViewBuilder
import com.intellij.ide.ui.UISettings
import com.intellij.ide.util.treeView.smartTree.NodeProvider
import com.intellij.ide.util.treeView.smartTree.TreeElement
import com.intellij.lang.Language
import com.intellij.lang.LanguageStructureViewBuilder
import com.intellij.openapi.actionSystem.CommonDataKeys
@@ -67,7 +69,7 @@ abstract class StructureAwareNavBarModelExtension : AbstractNavBarModelExtension
}
private fun findParentInModel(root: StructureViewTreeElement, psiElement: PsiElement): PsiElement? {
for (child in root.children) {
for (child in childrenFromNodeAndProviders(root)) {
if ((child as StructureViewTreeElement).value == psiElement) {
return root.value as? PsiElement
}
@@ -91,19 +93,25 @@ abstract class StructureAwareNavBarModelExtension : AbstractNavBarModelExtension
return model
}
private fun processStructureViewChildren(root: StructureViewTreeElement,
private fun processStructureViewChildren(parent: StructureViewTreeElement,
`object`: Any,
processor: Processor<Any>): Boolean {
if (root.value == `object`) {
return root.children
if (parent.value == `object`) {
return childrenFromNodeAndProviders(parent)
.filterIsInstance<StructureViewTreeElement>()
.all { processor.process(it.value) }
}
return root.children
return childrenFromNodeAndProviders(parent)
.filterIsInstance<StructureViewTreeElement>()
.all { processStructureViewChildren(it, `object`, processor) }
}
private fun childrenFromNodeAndProviders(parent: StructureViewTreeElement): List<TreeElement> {
return parent.children.toList() + applicableNodeProviders.flatMap { it.provideNodes(parent) }
}
override fun normalizeChildren() = false
protected open val applicableNodeProviders: List<NodeProvider<*>> = emptyList()
}