From f14f2c19a8a25136ada3ed0a9af400a497a4c601 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Tue, 18 Feb 2014 12:16:44 +0400 Subject: [PATCH] Fix goto class action in Idea 13.1 --- .../jet/lang/psi/JetObjectDeclaration.java | 10 ++- .../jet/generators/tests/GenerateTests.kt | 3 +- idea/src/META-INF/plugin.xml | 2 + .../caches/JetGotoClassContributor.java | 25 +----- .../presentation/JetObjectPresenter.java | 28 ++++++ .../navigation/gotoClass/enumEntries.kt | 11 +++ .../navigation/gotoClass/inClassObject.kt | 21 +++++ .../navigation/gotoClass/innerClass.kt | 10 +++ .../navigation/gotoClass/localDeclarations.kt | 17 ++++ .../gotoClass/noImplementationTrait.kt | 9 ++ .../navigation/gotoClass/simpleClass.kt | 4 + .../navigation/gotoClass/simpleObject.kt | 6 ++ .../gotoClass/traitWithFunImplement.kt | 10 +++ .../navigation/AbstractKotlinGotoTest.java | 15 +++- .../navigation/KotlinGotoTestGenerated.java | 88 +++++++++++++++---- 15 files changed, 212 insertions(+), 47 deletions(-) create mode 100644 idea/src/org/jetbrains/jet/plugin/presentation/JetObjectPresenter.java create mode 100644 idea/testData/navigation/gotoClass/enumEntries.kt create mode 100644 idea/testData/navigation/gotoClass/inClassObject.kt create mode 100644 idea/testData/navigation/gotoClass/innerClass.kt create mode 100644 idea/testData/navigation/gotoClass/localDeclarations.kt create mode 100644 idea/testData/navigation/gotoClass/noImplementationTrait.kt create mode 100644 idea/testData/navigation/gotoClass/simpleClass.kt create mode 100644 idea/testData/navigation/gotoClass/simpleObject.kt create mode 100644 idea/testData/navigation/gotoClass/traitWithFunImplement.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclaration.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclaration.java index 9d40506a5a6..340d64ebe76 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclaration.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclaration.java @@ -17,6 +17,8 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; +import com.intellij.navigation.ItemPresentation; +import com.intellij.navigation.ItemPresentationProviders; import com.intellij.psi.PsiElement; import com.intellij.psi.stubs.IStubElementType; import com.intellij.util.IncorrectOperationException; @@ -181,8 +183,8 @@ public class JetObjectDeclaration extends JetNamedDeclarationStub) { } testClass(javaClass()) { - model("navigation/gotoSymbol") + model("navigation/gotoClass", testMethod = "doClassTest") + model("navigation/gotoSymbol", testMethod = "doSymbolTest") } testClass(javaClass()) { diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index b0993eed9fb..6059bb3cea2 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -266,6 +266,8 @@ forClass="org.jetbrains.jet.lang.psi.JetNamedFunction"/> + javaQualifiedNames = new HashSet(); - for (PsiClass aClass : classes) { - String qualifiedName = aClass.getQualifiedName(); - if (qualifiedName != null) { - javaQualifiedNames.add(qualifiedName); - } - } - List items = new ArrayList(); for (JetClassOrObject classOrObject : classesOrObjects) { - FqName fqName = JetPsiUtil.getFQName(classOrObject); - if (fqName == null || javaQualifiedNames.contains(fqName.toString())) { - // Elements will be added by Java class contributor - continue; - } - - if (classOrObject instanceof JetClass) { + if (classOrObject != null && !(classOrObject instanceof JetEnumEntry)) { items.add(classOrObject); } } diff --git a/idea/src/org/jetbrains/jet/plugin/presentation/JetObjectPresenter.java b/idea/src/org/jetbrains/jet/plugin/presentation/JetObjectPresenter.java new file mode 100644 index 00000000000..55f821bd845 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/presentation/JetObjectPresenter.java @@ -0,0 +1,28 @@ +/* + * Copyright 2010-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. + */ + +package org.jetbrains.jet.plugin.presentation; + +import com.intellij.navigation.ItemPresentation; +import com.intellij.navigation.ItemPresentationProvider; +import org.jetbrains.jet.lang.psi.JetObjectDeclaration; + +public class JetObjectPresenter implements ItemPresentationProvider { + @Override + public ItemPresentation getPresentation(JetObjectDeclaration item) { + return new JetDefaultNamedDeclarationPresentation(item); + } +} \ No newline at end of file diff --git a/idea/testData/navigation/gotoClass/enumEntries.kt b/idea/testData/navigation/gotoClass/enumEntries.kt new file mode 100644 index 00000000000..f64c993424b --- /dev/null +++ b/idea/testData/navigation/gotoClass/enumEntries.kt @@ -0,0 +1,11 @@ +package some.small + +public enum class EnumClass { + EnumClassTrue + EnumClassFalse +} + +// Check that enum class present but entries are not + +// SEARCH_TEXT: EnumClass +// REF: (some.small).EnumClass \ No newline at end of file diff --git a/idea/testData/navigation/gotoClass/inClassObject.kt b/idea/testData/navigation/gotoClass/inClassObject.kt new file mode 100644 index 00000000000..6cb420eba56 --- /dev/null +++ b/idea/testData/navigation/gotoClass/inClassObject.kt @@ -0,0 +1,21 @@ +package test + +class InClassObject { + class object { + class ClassObjectClass {} + + trait ClassObjectTrait {} + + trait ClassObjectTraitWithImpl { + fun foo() {} + } + + object ClassObjectObject() {} + } +} + +// SEARCH_TEXT: ClassObject +// REF: (test.InClassObject).ClassObjectClass +// REF: (test.InClassObject).ClassObjectObject +// REF: (test.InClassObject).ClassObjectTrait +// REF: (test.InClassObject).ClassObjectTraitWithImpl \ No newline at end of file diff --git a/idea/testData/navigation/gotoClass/innerClass.kt b/idea/testData/navigation/gotoClass/innerClass.kt new file mode 100644 index 00000000000..0879628e87d --- /dev/null +++ b/idea/testData/navigation/gotoClass/innerClass.kt @@ -0,0 +1,10 @@ +package small + +class A { + class InnerA { + + } +} + +// SEARCH_TEXT: Inner +// REF: (small.A).InnerA \ No newline at end of file diff --git a/idea/testData/navigation/gotoClass/localDeclarations.kt b/idea/testData/navigation/gotoClass/localDeclarations.kt new file mode 100644 index 00000000000..8be79d4de0d --- /dev/null +++ b/idea/testData/navigation/gotoClass/localDeclarations.kt @@ -0,0 +1,17 @@ +fun foo() { + class LocalClass {} + + trait LocalTrait {} + + trait LocalTraitWithImpl { + fun foo() {} + } + + object LocalObject() {} +} + +// SEARCH_TEXT: Local +// REF: LocalClass +// REF: LocalObject +// REF: LocalTrait +// REF: LocalTraitWithImpl diff --git a/idea/testData/navigation/gotoClass/noImplementationTrait.kt b/idea/testData/navigation/gotoClass/noImplementationTrait.kt new file mode 100644 index 00000000000..13ed9e7edf6 --- /dev/null +++ b/idea/testData/navigation/gotoClass/noImplementationTrait.kt @@ -0,0 +1,9 @@ +package test + +trait NoImplementationTrait { + fun foo(): Int + fun some(): String +} + +// SEARCH_TEXT: NoImplemen +// REF: (test).NoImplementationTrait \ No newline at end of file diff --git a/idea/testData/navigation/gotoClass/simpleClass.kt b/idea/testData/navigation/gotoClass/simpleClass.kt new file mode 100644 index 00000000000..16fd383992f --- /dev/null +++ b/idea/testData/navigation/gotoClass/simpleClass.kt @@ -0,0 +1,4 @@ +class SimpleClass + +// SEARCH_TEXT: SimpleClass +// REF: ().SimpleClass \ No newline at end of file diff --git a/idea/testData/navigation/gotoClass/simpleObject.kt b/idea/testData/navigation/gotoClass/simpleObject.kt new file mode 100644 index 00000000000..8a9f1b9cc9b --- /dev/null +++ b/idea/testData/navigation/gotoClass/simpleObject.kt @@ -0,0 +1,6 @@ +object SimpleObject { + +} + +// SEARCH_TEXT: SimpleObject +// REF: ().SimpleObject diff --git a/idea/testData/navigation/gotoClass/traitWithFunImplement.kt b/idea/testData/navigation/gotoClass/traitWithFunImplement.kt new file mode 100644 index 00000000000..0635d144bd2 --- /dev/null +++ b/idea/testData/navigation/gotoClass/traitWithFunImplement.kt @@ -0,0 +1,10 @@ +package test + +trait TraitWithFunImplement { + fun foo(): Int { + return 12; + } +} + +// SEARCH_TEXT: Trait +// REF: (test).TraitWithFunImplement \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/navigation/AbstractKotlinGotoTest.java b/idea/tests/org/jetbrains/jet/plugin/navigation/AbstractKotlinGotoTest.java index f84ede2a3b5..42d97aebdec 100644 --- a/idea/tests/org/jetbrains/jet/plugin/navigation/AbstractKotlinGotoTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/navigation/AbstractKotlinGotoTest.java @@ -19,7 +19,10 @@ package org.jetbrains.jet.plugin.navigation; import com.google.common.base.Function; import com.google.common.collect.Lists; import com.google.common.collect.Ordering; +import com.intellij.ide.util.gotoByName.FilteringGotoByModel; +import com.intellij.ide.util.gotoByName.GotoClassModel2; import com.intellij.ide.util.gotoByName.GotoSymbolModel2; +import com.intellij.lang.Language; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; @@ -37,9 +40,14 @@ import java.util.Arrays; import java.util.List; public abstract class AbstractKotlinGotoTest extends JetLightCodeInsightFixtureTestCase { - protected void doTest(String path) { + protected void doSymbolTest(String path) { myFixture.configureByFile(path); - assertGotoSymbol(getProject(), myFixture.getEditor()); + assertGotoSymbol(new GotoSymbolModel2(getProject()), getProject(), myFixture.getEditor()); + } + + protected void doClassTest(String path) { + myFixture.configureByFile(path); + assertGotoSymbol(new GotoClassModel2(getProject()), getProject(), myFixture.getEditor()); } private String dirPath = null; @@ -68,7 +76,7 @@ public abstract class AbstractKotlinGotoTest extends JetLightCodeInsightFixtureT return getTestName(true) + ".kt"; } - private static void assertGotoSymbol(@NotNull Project project, @NotNull Editor editor) { + private static void assertGotoSymbol(FilteringGotoByModel model, @NotNull Project project, @NotNull Editor editor) { List searchTextList = InTextDirectivesUtils.findListWithPrefixes(editor.getDocument().getText(), "// SEARCH_TEXT:"); Assert.assertFalse("There's no search text in test data file given. Use '// SEARCH_TEXT:' directive", searchTextList.isEmpty()); @@ -80,7 +88,6 @@ public abstract class AbstractKotlinGotoTest extends JetLightCodeInsightFixtureT List elementsByName = new ArrayList(); - GotoSymbolModel2 model = new GotoSymbolModel2(project); String[] names = model.getNames(enableCheckbox); for (String name : names) { if (name != null && name.startsWith(searchText)) { diff --git a/idea/tests/org/jetbrains/jet/plugin/navigation/KotlinGotoTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/navigation/KotlinGotoTestGenerated.java index 44e14efcede..1739d4906cd 100644 --- a/idea/tests/org/jetbrains/jet/plugin/navigation/KotlinGotoTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/navigation/KotlinGotoTestGenerated.java @@ -30,25 +30,83 @@ import org.jetbrains.jet.plugin.navigation.AbstractKotlinGotoTest; /** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ @SuppressWarnings("all") -@TestMetadata("idea/testData/navigation/gotoSymbol") +@InnerTestClasses({KotlinGotoTestGenerated.GotoClass.class, KotlinGotoTestGenerated.GotoSymbol.class}) public class KotlinGotoTestGenerated extends AbstractKotlinGotoTest { - public void testAllFilesPresentInGotoSymbol() throws Exception { - JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/navigation/gotoSymbol"), Pattern.compile("^(.+)\\.kt$"), true); + @TestMetadata("idea/testData/navigation/gotoClass") + public static class GotoClass extends AbstractKotlinGotoTest { + public void testAllFilesPresentInGotoClass() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/navigation/gotoClass"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("enumEntries.kt") + public void testEnumEntries() throws Exception { + doClassTest("idea/testData/navigation/gotoClass/enumEntries.kt"); + } + + @TestMetadata("inClassObject.kt") + public void testInClassObject() throws Exception { + doClassTest("idea/testData/navigation/gotoClass/inClassObject.kt"); + } + + @TestMetadata("innerClass.kt") + public void testInnerClass() throws Exception { + doClassTest("idea/testData/navigation/gotoClass/innerClass.kt"); + } + + @TestMetadata("localDeclarations.kt") + public void testLocalDeclarations() throws Exception { + doClassTest("idea/testData/navigation/gotoClass/localDeclarations.kt"); + } + + @TestMetadata("noImplementationTrait.kt") + public void testNoImplementationTrait() throws Exception { + doClassTest("idea/testData/navigation/gotoClass/noImplementationTrait.kt"); + } + + @TestMetadata("simpleClass.kt") + public void testSimpleClass() throws Exception { + doClassTest("idea/testData/navigation/gotoClass/simpleClass.kt"); + } + + @TestMetadata("simpleObject.kt") + public void testSimpleObject() throws Exception { + doClassTest("idea/testData/navigation/gotoClass/simpleObject.kt"); + } + + @TestMetadata("traitWithFunImplement.kt") + public void testTraitWithFunImplement() throws Exception { + doClassTest("idea/testData/navigation/gotoClass/traitWithFunImplement.kt"); + } + } - @TestMetadata("functions.kt") - public void testFunctions() throws Exception { - doTest("idea/testData/navigation/gotoSymbol/functions.kt"); + @TestMetadata("idea/testData/navigation/gotoSymbol") + public static class GotoSymbol extends AbstractKotlinGotoTest { + public void testAllFilesPresentInGotoSymbol() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/navigation/gotoSymbol"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("functions.kt") + public void testFunctions() throws Exception { + doSymbolTest("idea/testData/navigation/gotoSymbol/functions.kt"); + } + + @TestMetadata("javaMethods.kt") + public void testJavaMethods() throws Exception { + doSymbolTest("idea/testData/navigation/gotoSymbol/javaMethods.kt"); + } + + @TestMetadata("properties.kt") + public void testProperties() throws Exception { + doSymbolTest("idea/testData/navigation/gotoSymbol/properties.kt"); + } + } - @TestMetadata("javaMethods.kt") - public void testJavaMethods() throws Exception { - doTest("idea/testData/navigation/gotoSymbol/javaMethods.kt"); + public static Test suite() { + TestSuite suite = new TestSuite("KotlinGotoTestGenerated"); + suite.addTestSuite(GotoClass.class); + suite.addTestSuite(GotoSymbol.class); + return suite; } - - @TestMetadata("properties.kt") - public void testProperties() throws Exception { - doTest("idea/testData/navigation/gotoSymbol/properties.kt"); - } - }