Fix goto class action in Idea 13.1

This commit is contained in:
Nikolay Krasko
2014-02-18 12:16:44 +04:00
parent bd859efb39
commit f14f2c19a8
15 changed files with 212 additions and 47 deletions
@@ -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<PsiJetObjectSt
JetPsiUtil.deleteClass(this);
}
//@Override
//public ItemPresentation getPresentation() {
// return ItemPresentationProviders.getItemPresentation(this);
//}
@Override
public ItemPresentation getPresentation() {
return ItemPresentationProviders.getItemPresentation(this);
}
}
@@ -295,7 +295,8 @@ fun main(args: Array<String>) {
}
testClass(javaClass<AbstractKotlinGotoTest>()) {
model("navigation/gotoSymbol")
model("navigation/gotoClass", testMethod = "doClassTest")
model("navigation/gotoSymbol", testMethod = "doSymbolTest")
}
testClass(javaClass<AbstractQuickFixMultiFileTest>()) {
+2
View File
@@ -266,6 +266,8 @@
forClass="org.jetbrains.jet.lang.psi.JetNamedFunction"/>
<itemPresentationProvider implementationClass="org.jetbrains.jet.plugin.presentation.JetClassPresenter"
forClass="org.jetbrains.jet.lang.psi.JetClass"/>
<itemPresentationProvider implementationClass="org.jetbrains.jet.plugin.presentation.JetObjectPresenter"
forClass="org.jetbrains.jet.lang.psi.JetObjectDeclaration"/>
<itemPresentationProvider implementationClass="org.jetbrains.jet.plugin.presentation.JetPropertyPresenter"
forClass="org.jetbrains.jet.lang.psi.JetProperty"/>
<itemPresentationProvider implementationClass="org.jetbrains.jet.plugin.presentation.JetParameterPresenter"
@@ -19,21 +19,15 @@ package org.jetbrains.jet.plugin.caches;
import com.intellij.navigation.GotoClassContributor;
import com.intellij.navigation.NavigationItem;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiClass;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.PsiShortNamesCache;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetClass;
import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.psi.JetNamedDeclaration;
import org.jetbrains.jet.lang.psi.JetPsiUtil;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.plugin.stubindex.JetShortClassNameIndex;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
public class JetGotoClassContributor implements GotoClassContributor {
@@ -71,24 +65,9 @@ public class JetGotoClassContributor implements GotoClassContributor {
return NavigationItem.EMPTY_NAVIGATION_ITEM_ARRAY;
}
PsiClass[] classes = PsiShortNamesCache.getInstance(project).getClassesByName(name, scope);
Collection<String> javaQualifiedNames = new HashSet<String>();
for (PsiClass aClass : classes) {
String qualifiedName = aClass.getQualifiedName();
if (qualifiedName != null) {
javaQualifiedNames.add(qualifiedName);
}
}
List<NavigationItem> items = new ArrayList<NavigationItem>();
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);
}
}
@@ -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<JetObjectDeclaration> {
@Override
public ItemPresentation getPresentation(JetObjectDeclaration item) {
return new JetDefaultNamedDeclarationPresentation(item);
}
}
@@ -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
@@ -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
@@ -0,0 +1,10 @@
package small
class A {
class InnerA {
}
}
// SEARCH_TEXT: Inner
// REF: (small.A).InnerA
@@ -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
@@ -0,0 +1,9 @@
package test
trait NoImplementationTrait {
fun foo(): Int
fun some(): String
}
// SEARCH_TEXT: NoImplemen
// REF: (test).NoImplementationTrait
@@ -0,0 +1,4 @@
class SimpleClass
// SEARCH_TEXT: SimpleClass
// REF: (<root>).SimpleClass
@@ -0,0 +1,6 @@
object SimpleObject {
}
// SEARCH_TEXT: SimpleObject
// REF: (<root>).SimpleObject
@@ -0,0 +1,10 @@
package test
trait TraitWithFunImplement {
fun foo(): Int {
return 12;
}
}
// SEARCH_TEXT: Trait
// REF: (test).TraitWithFunImplement
@@ -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<Language> model, @NotNull Project project, @NotNull Editor editor) {
List<String> 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<Object> elementsByName = new ArrayList<Object>();
GotoSymbolModel2 model = new GotoSymbolModel2(project);
String[] names = model.getNames(enableCheckbox);
for (String name : names) {
if (name != null && name.startsWith(searchText)) {
@@ -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");
}
}