From 2ef46b586d24735ea6592ce619f05759e6b93919 Mon Sep 17 00:00:00 2001 From: Nikita Bobko Date: Tue, 26 May 2020 23:46:30 +0300 Subject: [PATCH] Fix broken NavBar for 201 ^KT-38466 Fixed ^KT-38260 Fixed --- .../kotlin/generators/tests/GenerateTests.kt | 5 ++ .../structureView/KotlinStructureViewModel.kt | 4 +- .../AbstractNavBarModelExtensionCompatBase.kt | 2 +- ...tractNavBarModelExtensionCompatBase.kt.201 | 11 +++- .../KotlinNavBarModelExtension.kt | 4 +- .../navigationToolbar/ClassProperty.kt | 8 +++ .../navigationToolbar/ClassProperty.kt.201 | 8 +++ .../navigationToolbar/MethodInClass.kt | 5 ++ .../navigationToolbar/MethodInClass.kt.201 | 5 ++ .../navigationToolbar/SeveralClassesInFile.kt | 13 ++++ .../SeveralClassesInFile.kt.201 | 13 ++++ .../fileNameDoesntMatchClassName.kt | 5 ++ .../fileNameDoesntMatchClassName.kt.201 | 5 ++ .../navigationToolbar/topLevelFunction.kt | 9 +++ .../navigationToolbar/topLevelFunction.kt.201 | 9 +++ .../navigationToolbar/topLevelProperty.kt | 6 ++ .../navigationToolbar/topLevelProperty.kt.201 | 6 ++ .../AbstractKotlinNavBarTest.kt | 34 +++++++++++ .../AbstractKotlinNavBarTest.kt.201 | 34 +++++++++++ .../KotlinNavBarTestGenerated.java | 60 +++++++++++++++++++ 20 files changed, 241 insertions(+), 5 deletions(-) create mode 100644 idea/testData/navigationToolbar/ClassProperty.kt create mode 100644 idea/testData/navigationToolbar/ClassProperty.kt.201 create mode 100644 idea/testData/navigationToolbar/MethodInClass.kt create mode 100644 idea/testData/navigationToolbar/MethodInClass.kt.201 create mode 100644 idea/testData/navigationToolbar/SeveralClassesInFile.kt create mode 100644 idea/testData/navigationToolbar/SeveralClassesInFile.kt.201 create mode 100644 idea/testData/navigationToolbar/fileNameDoesntMatchClassName.kt create mode 100644 idea/testData/navigationToolbar/fileNameDoesntMatchClassName.kt.201 create mode 100644 idea/testData/navigationToolbar/topLevelFunction.kt create mode 100644 idea/testData/navigationToolbar/topLevelFunction.kt.201 create mode 100644 idea/testData/navigationToolbar/topLevelProperty.kt create mode 100644 idea/testData/navigationToolbar/topLevelProperty.kt.201 create mode 100644 idea/tests/org/jetbrains/kotlin/idea/navigationToolbar/AbstractKotlinNavBarTest.kt create mode 100644 idea/tests/org/jetbrains/kotlin/idea/navigationToolbar/AbstractKotlinNavBarTest.kt.201 create mode 100644 idea/tests/org/jetbrains/kotlin/idea/navigationToolbar/KotlinNavBarTestGenerated.java diff --git a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index b7bcf867702..be1cc85c181 100644 --- a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -104,6 +104,7 @@ import org.jetbrains.kotlin.idea.kdoc.AbstractKDocTypingTest import org.jetbrains.kotlin.idea.maven.AbstractKotlinMavenInspectionTest import org.jetbrains.kotlin.idea.maven.configuration.AbstractMavenConfigureProjectByChangingFileTest import org.jetbrains.kotlin.idea.navigation.* +import org.jetbrains.kotlin.idea.navigationToolbar.AbstractKotlinNavBarTest import org.jetbrains.kotlin.idea.parameterInfo.AbstractParameterInfoTest import org.jetbrains.kotlin.idea.perf.* import org.jetbrains.kotlin.idea.quickfix.AbstractQuickFixMultiFileTest @@ -902,6 +903,10 @@ fun main() { testClass { model("slicer/mpp", recursive = false, extension = null) } + + testClass { + model("navigationToolbar", recursive = false) + } } testGroup("idea/idea-fir/tests", "idea/testData") { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/structureView/KotlinStructureViewModel.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/structureView/KotlinStructureViewModel.kt index 9a26d7ae547..ec275746717 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/structureView/KotlinStructureViewModel.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/structureView/KotlinStructureViewModel.kt @@ -29,8 +29,8 @@ class KotlinStructureViewModel(ktFile: KtFile, editor: Editor?) : override fun isSuitable(element: PsiElement?): Boolean = element is KtDeclaration && element !is KtPropertyAccessor && element !is KtFunctionLiteral && - !(element is KtProperty && element.containingClassOrObject !is KtNamedDeclaration) && - !(element is KtFunction && element.containingClassOrObject !is KtNamedDeclaration) + !(element is KtProperty && element.parent !is KtFile && element.containingClassOrObject !is KtNamedDeclaration) && + !(element is KtFunction && element.parent !is KtFile && element.containingClassOrObject !is KtNamedDeclaration) override fun getNodeProviders() = NODE_PROVIDERS diff --git a/idea/src/org/jetbrains/kotlin/idea/navigationToolbar/AbstractNavBarModelExtensionCompatBase.kt b/idea/src/org/jetbrains/kotlin/idea/navigationToolbar/AbstractNavBarModelExtensionCompatBase.kt index 814897acfda..14c48d2e50d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/navigationToolbar/AbstractNavBarModelExtensionCompatBase.kt +++ b/idea/src/org/jetbrains/kotlin/idea/navigationToolbar/AbstractNavBarModelExtensionCompatBase.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.idea.navigationToolbar import com.intellij.ide.navigationToolbar.AbstractNavBarModelExtension import com.intellij.psi.PsiElement -// FIX ME WHEN BUNCH 201 REMOVED +// FIX ME WHEN BUNCH 193 REMOVED abstract class AbstractNavBarModelExtensionCompatBase : AbstractNavBarModelExtension() { protected abstract fun adjustElementImpl(psiElement: PsiElement?): PsiElement? diff --git a/idea/src/org/jetbrains/kotlin/idea/navigationToolbar/AbstractNavBarModelExtensionCompatBase.kt.201 b/idea/src/org/jetbrains/kotlin/idea/navigationToolbar/AbstractNavBarModelExtensionCompatBase.kt.201 index 5d854f84732..c5794523587 100644 --- a/idea/src/org/jetbrains/kotlin/idea/navigationToolbar/AbstractNavBarModelExtensionCompatBase.kt.201 +++ b/idea/src/org/jetbrains/kotlin/idea/navigationToolbar/AbstractNavBarModelExtensionCompatBase.kt.201 @@ -8,9 +8,11 @@ package org.jetbrains.kotlin.idea.navigationToolbar import com.intellij.ide.navigationToolbar.StructureAwareNavBarModelExtension import com.intellij.lang.Language import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.idea.KotlinIconProvider import org.jetbrains.kotlin.idea.KotlinLanguage +import org.jetbrains.kotlin.psi.KtFile -// FIX ME WHEN BUNCH 201 REMOVED +// FIX ME WHEN BUNCH 193 REMOVED abstract class AbstractNavBarModelExtensionCompatBase : StructureAwareNavBarModelExtension() { protected abstract fun adjustElementImpl(psiElement: PsiElement?): PsiElement? @@ -20,4 +22,11 @@ abstract class AbstractNavBarModelExtensionCompatBase : StructureAwareNavBarMode override val language: Language get() = KotlinLanguage.INSTANCE + + override fun acceptParentFromModel(psiElement: PsiElement?): Boolean { + if (psiElement is KtFile) { + return KotlinIconProvider.getSingleClass(psiElement) == null + } + return true + } } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/navigationToolbar/KotlinNavBarModelExtension.kt b/idea/src/org/jetbrains/kotlin/idea/navigationToolbar/KotlinNavBarModelExtension.kt index 721bdcd72ee..83eb8b9ce35 100644 --- a/idea/src/org/jetbrains/kotlin/idea/navigationToolbar/KotlinNavBarModelExtension.kt +++ b/idea/src/org/jetbrains/kotlin/idea/navigationToolbar/KotlinNavBarModelExtension.kt @@ -11,12 +11,14 @@ import org.jetbrains.kotlin.idea.projectView.KtDeclarationTreeNode.Companion.try import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtFile -// FIX ME WHEN BUNCH 201 REMOVED class KotlinNavBarModelExtension : AbstractNavBarModelExtensionCompatBase() { override fun getPresentableText(item: Any?): String? = (item as? KtDeclaration)?.let { tryGetRepresentableText(it, it.project) } override fun adjustElementImpl(psiElement: PsiElement?): PsiElement? { + if (psiElement is KtDeclaration) { + return psiElement + } val containingFile = psiElement?.containingFile as? KtFile ?: return psiElement if (containingFile.isScript()) return psiElement return KotlinIconProvider.getSingleClass(containingFile) ?: psiElement diff --git a/idea/testData/navigationToolbar/ClassProperty.kt b/idea/testData/navigationToolbar/ClassProperty.kt new file mode 100644 index 00000000000..4a43c8154c8 --- /dev/null +++ b/idea/testData/navigationToolbar/ClassProperty.kt @@ -0,0 +1,8 @@ +// NAV_BAR_ITEMS: src, ClassProperty + +class ClassProperty { + val foo: Int + get() { + return 42 + } +} \ No newline at end of file diff --git a/idea/testData/navigationToolbar/ClassProperty.kt.201 b/idea/testData/navigationToolbar/ClassProperty.kt.201 new file mode 100644 index 00000000000..9c21c983ec7 --- /dev/null +++ b/idea/testData/navigationToolbar/ClassProperty.kt.201 @@ -0,0 +1,8 @@ +// NAV_BAR_ITEMS: src, ClassProperty, foo: Int + +class ClassProperty { + val foo: Int + get() { + return 42 + } +} \ No newline at end of file diff --git a/idea/testData/navigationToolbar/MethodInClass.kt b/idea/testData/navigationToolbar/MethodInClass.kt new file mode 100644 index 00000000000..48d174267b7 --- /dev/null +++ b/idea/testData/navigationToolbar/MethodInClass.kt @@ -0,0 +1,5 @@ +// NAV_BAR_ITEMS: src, MethodInClass + +class MethodInClass { + fun foo() { } +} \ No newline at end of file diff --git a/idea/testData/navigationToolbar/MethodInClass.kt.201 b/idea/testData/navigationToolbar/MethodInClass.kt.201 new file mode 100644 index 00000000000..c752419bacb --- /dev/null +++ b/idea/testData/navigationToolbar/MethodInClass.kt.201 @@ -0,0 +1,5 @@ +// NAV_BAR_ITEMS: src, MethodInClass, foo() + +class MethodInClass { + fun foo() { } +} \ No newline at end of file diff --git a/idea/testData/navigationToolbar/SeveralClassesInFile.kt b/idea/testData/navigationToolbar/SeveralClassesInFile.kt new file mode 100644 index 00000000000..513cc5c22d8 --- /dev/null +++ b/idea/testData/navigationToolbar/SeveralClassesInFile.kt @@ -0,0 +1,13 @@ +// NAV_BAR_ITEMS: src, SeveralClassesInFile.kt + +class Foo { + +} + +class SeveralClassesInFile { + +} + +fun method() { + +} diff --git a/idea/testData/navigationToolbar/SeveralClassesInFile.kt.201 b/idea/testData/navigationToolbar/SeveralClassesInFile.kt.201 new file mode 100644 index 00000000000..38f65c1ed00 --- /dev/null +++ b/idea/testData/navigationToolbar/SeveralClassesInFile.kt.201 @@ -0,0 +1,13 @@ +// NAV_BAR_ITEMS: src, SeveralClassesInFile.kt, SeveralClassesInFile + +class Foo { + +} + +class SeveralClassesInFile { + +} + +fun method() { + +} diff --git a/idea/testData/navigationToolbar/fileNameDoesntMatchClassName.kt b/idea/testData/navigationToolbar/fileNameDoesntMatchClassName.kt new file mode 100644 index 00000000000..972955af0c3 --- /dev/null +++ b/idea/testData/navigationToolbar/fileNameDoesntMatchClassName.kt @@ -0,0 +1,5 @@ +// NAV_BAR_ITEMS: src, fileNameDoesntMatchClassName.kt + +class Foo { + fun bar() { } +} diff --git a/idea/testData/navigationToolbar/fileNameDoesntMatchClassName.kt.201 b/idea/testData/navigationToolbar/fileNameDoesntMatchClassName.kt.201 new file mode 100644 index 00000000000..d408983153f --- /dev/null +++ b/idea/testData/navigationToolbar/fileNameDoesntMatchClassName.kt.201 @@ -0,0 +1,5 @@ +// NAV_BAR_ITEMS: src, fileNameDoesntMatchClassName.kt, Foo, bar() + +class Foo { + fun bar() { } +} diff --git a/idea/testData/navigationToolbar/topLevelFunction.kt b/idea/testData/navigationToolbar/topLevelFunction.kt new file mode 100644 index 00000000000..0694a9a3a68 --- /dev/null +++ b/idea/testData/navigationToolbar/topLevelFunction.kt @@ -0,0 +1,9 @@ +// NAV_BAR_ITEMS: src, topLevelFunction.kt + +fun foo() { + val bar = "string" +} + +class SomeClass { + +} diff --git a/idea/testData/navigationToolbar/topLevelFunction.kt.201 b/idea/testData/navigationToolbar/topLevelFunction.kt.201 new file mode 100644 index 00000000000..1db12d66c5c --- /dev/null +++ b/idea/testData/navigationToolbar/topLevelFunction.kt.201 @@ -0,0 +1,9 @@ +// NAV_BAR_ITEMS: src, topLevelFunction.kt, foo() + +fun foo() { + val bar = "string" +} + +class SomeClass { + +} diff --git a/idea/testData/navigationToolbar/topLevelProperty.kt b/idea/testData/navigationToolbar/topLevelProperty.kt new file mode 100644 index 00000000000..055c49a1509 --- /dev/null +++ b/idea/testData/navigationToolbar/topLevelProperty.kt @@ -0,0 +1,6 @@ +// NAV_BAR_ITEMS: src, topLevelProperty.kt + +val foo: Int + get() { + return 1 + } \ No newline at end of file diff --git a/idea/testData/navigationToolbar/topLevelProperty.kt.201 b/idea/testData/navigationToolbar/topLevelProperty.kt.201 new file mode 100644 index 00000000000..a2b73b386bb --- /dev/null +++ b/idea/testData/navigationToolbar/topLevelProperty.kt.201 @@ -0,0 +1,6 @@ +// NAV_BAR_ITEMS: src, topLevelProperty.kt, foo: Int + +val foo: Int + get() { + return 1 + } \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/navigationToolbar/AbstractKotlinNavBarTest.kt b/idea/tests/org/jetbrains/kotlin/idea/navigationToolbar/AbstractKotlinNavBarTest.kt new file mode 100644 index 00000000000..8c65f9b10fd --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/idea/navigationToolbar/AbstractKotlinNavBarTest.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.navigationToolbar + +import com.intellij.ide.navigationToolbar.NavBarModel +import com.intellij.ide.navigationToolbar.NavBarModelExtension +import com.intellij.ide.navigationToolbar.NavBarPresentation +import com.intellij.openapi.actionSystem.DataContext +import com.intellij.openapi.editor.ex.EditorEx +import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase +import org.jetbrains.kotlin.test.InTextDirectivesUtils + + +abstract class AbstractKotlinNavBarTest : KotlinLightCodeInsightFixtureTestCase() { + + // inspired by: com.intellij.ide.navigationToolbar.JavaNavBarTest#assertNavBarModel + protected fun doTest(testPath: String) { + val psiFile = myFixture.configureByFile(testDataFile().name) + val model = NavBarModel(myFixture.project) + + model::class.java.getDeclaredMethod("updateModel", DataContext::class.java) + .apply { isAccessible = true } + .invoke(model, (myFixture.editor as EditorEx).dataContext) + + val actualItems = (0 until model.size()).map { + NavBarPresentation.calcPresentableText(model[it]) + } + val expectedItems = InTextDirectivesUtils.findListWithPrefixes(psiFile.text, "// NAV_BAR_ITEMS:") + assertOrderedEquals(actualItems, expectedItems) + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/navigationToolbar/AbstractKotlinNavBarTest.kt.201 b/idea/tests/org/jetbrains/kotlin/idea/navigationToolbar/AbstractKotlinNavBarTest.kt.201 new file mode 100644 index 00000000000..9fd4aa9700b --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/idea/navigationToolbar/AbstractKotlinNavBarTest.kt.201 @@ -0,0 +1,34 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.navigationToolbar + +import com.intellij.ide.navigationToolbar.NavBarModel +import com.intellij.ide.navigationToolbar.NavBarModelExtension +import com.intellij.ide.navigationToolbar.NavBarPresentation +import com.intellij.openapi.actionSystem.DataContext +import com.intellij.openapi.editor.ex.EditorEx +import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase +import org.jetbrains.kotlin.test.InTextDirectivesUtils + + +abstract class AbstractKotlinNavBarTest : KotlinLightCodeInsightFixtureTestCase() { + + // inspired by: com.intellij.ide.navigationToolbar.JavaNavBarTest#assertNavBarModel + protected fun doTest(testPath: String) { + val psiFile = myFixture.configureByFile(testDataFile().name) + val model = NavBarModel(myFixture.project) + + model::class.java.getDeclaredMethod("updateModel", DataContext::class.java) + .apply { isAccessible = true } + .invoke(model, (myFixture.editor as EditorEx).dataContext) + + val actualItems = (0 until model.size()).map { + NavBarPresentation.calcPresentableText(model[it], false) + } + val expectedItems = InTextDirectivesUtils.findListWithPrefixes(psiFile.text, "// NAV_BAR_ITEMS:") + assertOrderedEquals(actualItems, expectedItems) + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/navigationToolbar/KotlinNavBarTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/navigationToolbar/KotlinNavBarTestGenerated.java new file mode 100644 index 00000000000..1a62a8413f7 --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/idea/navigationToolbar/KotlinNavBarTestGenerated.java @@ -0,0 +1,60 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.navigationToolbar; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("idea/testData/navigationToolbar") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class KotlinNavBarTestGenerated extends AbstractKotlinNavBarTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInNavigationToolbar() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/navigationToolbar"), Pattern.compile("^(.+)\\.kt$"), null, false); + } + + @TestMetadata("ClassProperty.kt") + public void testClassProperty() throws Exception { + runTest("idea/testData/navigationToolbar/ClassProperty.kt"); + } + + @TestMetadata("fileNameDoesntMatchClassName.kt") + public void testFileNameDoesntMatchClassName() throws Exception { + runTest("idea/testData/navigationToolbar/fileNameDoesntMatchClassName.kt"); + } + + @TestMetadata("MethodInClass.kt") + public void testMethodInClass() throws Exception { + runTest("idea/testData/navigationToolbar/MethodInClass.kt"); + } + + @TestMetadata("SeveralClassesInFile.kt") + public void testSeveralClassesInFile() throws Exception { + runTest("idea/testData/navigationToolbar/SeveralClassesInFile.kt"); + } + + @TestMetadata("topLevelFunction.kt") + public void testTopLevelFunction() throws Exception { + runTest("idea/testData/navigationToolbar/topLevelFunction.kt"); + } + + @TestMetadata("topLevelProperty.kt") + public void testTopLevelProperty() throws Exception { + runTest("idea/testData/navigationToolbar/topLevelProperty.kt"); + } +}