mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-08 15:09:39 +07:00
Honor node providers when building navbar from structure (IDEA-231342)
GitOrigin-RevId: 3e2322ff7ee747ed016423835682052acb966a67
This commit is contained in:
committed by
intellij-monorepo-bot
parent
dafad04681
commit
2713fd1432
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
class LambdaExpression {
|
||||
public void foo() {
|
||||
new ArrayList<String>().forEach((x) -> System.out.<caret>println(x));
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
Reference in New Issue
Block a user