From 86729fe0cd3ea8afe9b4a56e4e8e48e292436ade Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 30 Jan 2020 19:46:23 +0100 Subject: [PATCH] Fix Java navbar for file with multiple classes GitOrigin-RevId: 81e4fc4106dd50198384815226d33ed0a850707d --- .../ide/navigationToolbar/JavaNavBarExtension.java | 8 ++++++++ .../testData/ide/navigationToolbar/multipleClasses.java | 7 +++++++ .../intellij/ide/navigationToolbar/JavaNavBarTest.java | 5 +++++ .../StructureAwareNavBarModelExtension.kt | 6 +++++- 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/ide/navigationToolbar/multipleClasses.java diff --git a/java/java-impl/src/com/intellij/ide/navigationToolbar/JavaNavBarExtension.java b/java/java-impl/src/com/intellij/ide/navigationToolbar/JavaNavBarExtension.java index e54e56a0c094..3e8dd41c3fd9 100644 --- a/java/java-impl/src/com/intellij/ide/navigationToolbar/JavaNavBarExtension.java +++ b/java/java-impl/src/com/intellij/ide/navigationToolbar/JavaNavBarExtension.java @@ -112,4 +112,12 @@ public class JavaNavBarExtension extends StructureAwareNavBarModelExtension { protected List> getApplicableNodeProviders() { return myNodeProviders; } + + @Override + protected boolean acceptParentFromModel(@Nullable PsiElement psiElement) { + if (psiElement instanceof PsiJavaFile) { + return ((PsiJavaFile) psiElement).getClasses().length > 1; + } + return true; + } } diff --git a/java/java-tests/testData/ide/navigationToolbar/multipleClasses.java b/java/java-tests/testData/ide/navigationToolbar/multipleClasses.java new file mode 100644 index 000000000000..ae5e0ffd815c --- /dev/null +++ b/java/java-tests/testData/ide/navigationToolbar/multipleClasses.java @@ -0,0 +1,7 @@ +public class Foo { + +} + +class Bar { + +} diff --git a/java/java-tests/testSrc/com/intellij/ide/navigationToolbar/JavaNavBarTest.java b/java/java-tests/testSrc/com/intellij/ide/navigationToolbar/JavaNavBarTest.java index 9aeaf06d2190..267bc0f07a6e 100644 --- a/java/java-tests/testSrc/com/intellij/ide/navigationToolbar/JavaNavBarTest.java +++ b/java/java-tests/testSrc/com/intellij/ide/navigationToolbar/JavaNavBarTest.java @@ -32,6 +32,11 @@ public class JavaNavBarTest extends LightJavaCodeInsightFixtureTestCase { assertNavBarModel("src", "LambdaExpression", "foo", "Lambda"); } + public void testMultipleClasses() { + myFixture.configureByFile("multipleClasses.java"); + assertNavBarModel("src", "multipleClasses.java", "Bar"); + } + public void assertNavBarModel(String... expectedItems) { NavBarModel model = new NavBarModel(myFixture.getProject()); model.updateModel(((EditorEx)myFixture.getEditor()).getDataContext()); diff --git a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/StructureAwareNavBarModelExtension.kt b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/StructureAwareNavBarModelExtension.kt index 541f43c3ed69..70c1754d8c42 100644 --- a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/StructureAwareNavBarModelExtension.kt +++ b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/StructureAwareNavBarModelExtension.kt @@ -60,7 +60,7 @@ abstract class StructureAwareNavBarModelExtension : AbstractNavBarModelExtension val model = buildStructureViewModel(file) if (model != null) { val parentInModel = findParentInModel(model.root, psiElement) - if (parentInModel !is PsiFile) { + if (acceptParentFromModel(parentInModel)) { return parentInModel } } @@ -68,6 +68,10 @@ abstract class StructureAwareNavBarModelExtension : AbstractNavBarModelExtension return super.getParent(psiElement) } + protected open fun acceptParentFromModel(psiElement: PsiElement?): Boolean { + return true + } + private fun findParentInModel(root: StructureViewTreeElement, psiElement: PsiElement): PsiElement? { for (child in childrenFromNodeAndProviders(root)) { if ((child as StructureViewTreeElement).value == psiElement) {