Fix display of enum members in navbar (IDEA-231596)
authorDmitry Jemerov <yole@jetbrains.com>
Tue, 28 Jan 2020 13:57:00 +0000 (14:57 +0100)
committerintellij-monorepo-bot <intellij-monorepo-bot-no-reply@jetbrains.com>
Tue, 28 Jan 2020 19:03:30 +0000 (19:03 +0000)
GitOrigin-RevId: 1a429cba7fe88365f22085b49e29010eae3ef4e8

java/java-structure-view/src/com/intellij/ide/structureView/impl/java/JavaClassTreeElement.java
java/java-structure-view/src/com/intellij/ide/structureView/impl/java/PsiFieldTreeElement.java
java/java-tests/testData/ide/navigationToolbar/enumMember.java [new file with mode: 0644]
java/java-tests/testData/ide/navigationToolbar/simple.java [new file with mode: 0644]
java/java-tests/testSrc/com/intellij/ide/navigationToolbar/JavaNavBarTest.java [new file with mode: 0644]

index 983d82e69c4f2ac39b9d7ad5502b523756678a90..08739782ecc51ea53167513dd4f79a8735ed3366 100644 (file)
@@ -1,18 +1,4 @@
-/*
- * Copyright 2000-2017 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
+// 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.structureView.impl.java;
 
 import com.intellij.ide.structureView.StructureViewTreeElement;
@@ -44,11 +30,10 @@ public class JavaClassTreeElement extends JavaClassTreeElementBase<PsiClass> {
   @Override
   @NotNull
   public Collection<StructureViewTreeElement> getChildrenBase() {
-    return getClassChildren();
+    return getClassChildren(getElement());
   }
 
-  private Collection<StructureViewTreeElement> getClassChildren() {
-    final PsiClass aClass = getElement();
+  static Collection<StructureViewTreeElement> getClassChildren(PsiClass aClass) {
     if (aClass == null) return Collections.emptyList();
 
     LinkedHashSet<PsiElement> members = getOwnChildren(aClass);
index 75d1cc2f767b6742ce048cd811dd0371e819f17a..e8e61e174de3dc2368b3618d9a1a9c0c237260e3 100644 (file)
@@ -1,24 +1,12 @@
-/*
- * Copyright 2000-2014 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
+// 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.structureView.impl.java;
 
 import com.intellij.ide.structureView.StructureViewTreeElement;
 import com.intellij.ide.util.treeView.smartTree.SortableTreeElement;
 import com.intellij.openapi.project.DumbService;
 import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.psi.PsiEnumConstant;
+import com.intellij.psi.PsiEnumConstantInitializer;
 import com.intellij.psi.PsiField;
 import com.intellij.psi.PsiSubstitutor;
 import org.jetbrains.annotations.NotNull;
@@ -36,6 +24,13 @@ public class PsiFieldTreeElement extends JavaClassTreeElementBase<PsiField> impl
   @Override
   @NotNull
   public Collection<StructureViewTreeElement> getChildrenBase() {
+    PsiField field = getField();
+    if (field instanceof PsiEnumConstant) {
+      PsiEnumConstantInitializer initializingClass = ((PsiEnumConstant)field).getInitializingClass();
+      if (initializingClass != null) {
+        return JavaClassTreeElement.getClassChildren(initializingClass);
+      }
+    }
     return Collections.emptyList();
   }
 
diff --git a/java/java-tests/testData/ide/navigationToolbar/enumMember.java b/java/java-tests/testData/ide/navigationToolbar/enumMember.java
new file mode 100644 (file)
index 0000000..2c02e71
--- /dev/null
@@ -0,0 +1,7 @@
+enum EnumMember {
+  BAR {
+    void foo() {
+      <caret>
+    }
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/ide/navigationToolbar/simple.java b/java/java-tests/testData/ide/navigationToolbar/simple.java
new file mode 100644 (file)
index 0000000..0e861bb
--- /dev/null
@@ -0,0 +1,5 @@
+class Simple {
+  public void foo() {
+    <caret>
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/ide/navigationToolbar/JavaNavBarTest.java b/java/java-tests/testSrc/com/intellij/ide/navigationToolbar/JavaNavBarTest.java
new file mode 100644 (file)
index 0000000..2ebfe36
--- /dev/null
@@ -0,0 +1,39 @@
+// 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.intellij.JavaTestUtil;
+import com.intellij.openapi.editor.ex.EditorEx;
+import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author yole
+ */
+public class JavaNavBarTest extends LightJavaCodeInsightFixtureTestCase {
+  @Override
+  protected String getTestDataPath() {
+    return JavaTestUtil.getJavaTestDataPath() + "/ide/navigationToolbar";
+  }
+
+  public void testSimple() {
+    myFixture.configureByFile("simple.java");
+    assertNavBarModel("src", "Simple", "foo");
+  }
+
+  public void testEnumMember() {
+    myFixture.configureByFile("enumMember.java");
+    assertNavBarModel("src", "EnumMember", "BAR", "foo");
+  }
+
+  public void assertNavBarModel(String... expectedItems) {
+    NavBarModel model = new NavBarModel(myFixture.getProject());
+    model.updateModel(((EditorEx)myFixture.getEditor()).getDataContext());
+    List<String> items = new ArrayList<>();
+    for (int i = 0; i < model.size(); i++) {
+      items.add(NavBarPresentation.calcPresentableText(model.get(i), false));
+    }
+    assertSameElements(items, expectedItems);
+  }
+}