From b5fb09b8bc1a59183d3ae0cb507d94c02b7f5756 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 15 Dec 2014 17:17:38 +0300 Subject: [PATCH] Find Usages: Support text-file search of Kotlin declarations --- .../DelegatingFindMemberUsagesHandler.kt | 2 ++ .../handlers/KotlinFindClassUsagesHandler.kt | 27 ++++++++++++++++--- .../findClassUsages/classUsedInPlainText.0.kt | 7 +++++ .../classUsedInPlainText.1.text | 2 ++ .../classUsedInPlainText.results.txt | 1 + .../functionUsedInPlainText.0.kt | 9 +++++++ .../functionUsedInPlainText.1.text | 1 + .../functionUsedInPlainText.results.txt | 1 + .../findUsages/AbstractJetFindUsagesTest.java | 7 ++++- .../JetFindUsagesTestGenerated.java | 12 +++++++++ 10 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 idea/testData/findUsages/kotlin/findClassUsages/classUsedInPlainText.0.kt create mode 100644 idea/testData/findUsages/kotlin/findClassUsages/classUsedInPlainText.1.text create mode 100644 idea/testData/findUsages/kotlin/findClassUsages/classUsedInPlainText.results.txt create mode 100644 idea/testData/findUsages/kotlin/findFunctionUsages/functionUsedInPlainText.0.kt create mode 100644 idea/testData/findUsages/kotlin/findFunctionUsages/functionUsedInPlainText.1.text create mode 100644 idea/testData/findUsages/kotlin/findFunctionUsages/functionUsedInPlainText.results.txt diff --git a/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/DelegatingFindMemberUsagesHandler.kt b/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/DelegatingFindMemberUsagesHandler.kt index 1c0a6f4e60b..e4f22f72a13 100644 --- a/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/DelegatingFindMemberUsagesHandler.kt +++ b/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/DelegatingFindMemberUsagesHandler.kt @@ -72,4 +72,6 @@ class DelegatingFindMemberUsagesHandler( } return handler.processElementUsages(element, processor, handlerOptions) } + + override fun isSearchForTextOccurencesAvailable(psiElement: PsiElement, isSingleFile: Boolean): Boolean = !isSingleFile } diff --git a/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindClassUsagesHandler.kt b/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindClassUsagesHandler.kt index 4b9a53d7892..3d646543e8e 100644 --- a/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindClassUsagesHandler.kt +++ b/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindClassUsagesHandler.kt @@ -37,6 +37,10 @@ import org.jetbrains.jet.plugin.findUsages.toClassHelper import org.jetbrains.jet.plugin.findUsages.toClassDeclarationsHelper import org.jetbrains.jet.plugin.search.usagesSearch.search import org.jetbrains.jet.plugin.util.application.runReadAction +import org.jetbrains.jet.asJava.namedUnwrappedElement +import java.util.Collections +import com.intellij.find.findUsages.JavaFindUsagesHandler +import com.intellij.find.findUsages.JavaFindUsagesHandlerFactory public class KotlinFindClassUsagesHandler( jetClass: JetClassOrObject, @@ -84,11 +88,26 @@ public class KotlinFindClassUsagesHandler( } } - protected override fun isSearchForTextOccurencesAvailable(psiElement: PsiElement, isSingleFile: Boolean): Boolean { - if (isSingleFile) - return false + protected override fun getStringsToSearch(element: PsiElement): Collection { + val psiClass = when (element) { + is PsiClass -> element + is JetClassOrObject -> LightClassUtil.getPsiClass(getElement()) + else -> null + } ?: return Collections.emptyList() - return psiElement is JetClassOrObject + // Work around the protected method in JavaFindUsagesHandler + // todo: Use JavaFindUsagesHelper.getElementNames() when it becomes public in IDEA + var stringsToSearch: Collection + object: JavaFindUsagesHandler(psiClass, JavaFindUsagesHandlerFactory.getInstance(element.getProject())) { + { + stringsToSearch = getStringsToSearch(psiClass) + } + } + return stringsToSearch + } + + protected override fun isSearchForTextOccurencesAvailable(psiElement: PsiElement, isSingleFile: Boolean): Boolean { + return !isSingleFile } public override fun getFindUsagesOptions(dataContext: DataContext?): FindUsagesOptions { diff --git a/idea/testData/findUsages/kotlin/findClassUsages/classUsedInPlainText.0.kt b/idea/testData/findUsages/kotlin/findClassUsages/classUsedInPlainText.0.kt new file mode 100644 index 00000000000..38a5a5b190e --- /dev/null +++ b/idea/testData/findUsages/kotlin/findClassUsages/classUsedInPlainText.0.kt @@ -0,0 +1,7 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetClass +// OPTIONS: textOccurrences +package test + +class Foo { + +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findClassUsages/classUsedInPlainText.1.text b/idea/testData/findUsages/kotlin/findClassUsages/classUsedInPlainText.1.text new file mode 100644 index 00000000000..5a97899c2c0 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findClassUsages/classUsedInPlainText.1.text @@ -0,0 +1,2 @@ +test.Foo +Foo \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findClassUsages/classUsedInPlainText.results.txt b/idea/testData/findUsages/kotlin/findClassUsages/classUsedInPlainText.results.txt new file mode 100644 index 00000000000..44a4222c2a7 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findClassUsages/classUsedInPlainText.results.txt @@ -0,0 +1 @@ +Unclassified usage (1: 1) test.Foo \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/functionUsedInPlainText.0.kt b/idea/testData/findUsages/kotlin/findFunctionUsages/functionUsedInPlainText.0.kt new file mode 100644 index 00000000000..150833d1d0f --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/functionUsedInPlainText.0.kt @@ -0,0 +1,9 @@ +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetNamedFunction +// OPTIONS: textOccurrences +package test + +class Foo { + fun foo() { + + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/functionUsedInPlainText.1.text b/idea/testData/findUsages/kotlin/findFunctionUsages/functionUsedInPlainText.1.text new file mode 100644 index 00000000000..841761f8f27 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/functionUsedInPlainText.1.text @@ -0,0 +1 @@ +Function foo is defined in class Foo \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/functionUsedInPlainText.results.txt b/idea/testData/findUsages/kotlin/findFunctionUsages/functionUsedInPlainText.results.txt new file mode 100644 index 00000000000..ece64a3e1f9 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/functionUsedInPlainText.results.txt @@ -0,0 +1 @@ +Unclassified usage (1: 10) Function foo is defined in class Foo \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/findUsages/AbstractJetFindUsagesTest.java b/idea/tests/org/jetbrains/jet/findUsages/AbstractJetFindUsagesTest.java index 74aef02c4e6..7bbe3f7e81e 100644 --- a/idea/tests/org/jetbrains/jet/findUsages/AbstractJetFindUsagesTest.java +++ b/idea/tests/org/jetbrains/jet/findUsages/AbstractJetFindUsagesTest.java @@ -231,6 +231,11 @@ public abstract class AbstractJetFindUsagesTest extends JetLightCodeInsightFixtu return true; } + else if (s.equals("textOccurrences")) { + options.isSearchForTextOccurrences = true; + return true; + } + return false; } @@ -304,7 +309,7 @@ public abstract class AbstractJetFindUsagesTest extends JetLightCodeInsightFixtu if (!name.startsWith(prefix) || name.equals(mainFileName)) return false; String ext = name.substring(name.lastIndexOf('.') + 1); - return ext.equals("kt") || ext.equals("java") || ext.equals("xml"); + return ext.equals("kt") || ext.equals("java") || ext.equals("xml") || ext.equals("text"); } } ); diff --git a/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTestGenerated.java b/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTestGenerated.java index 6c8861d09ae..41030c6efea 100644 --- a/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/findUsages/JetFindUsagesTestGenerated.java @@ -141,6 +141,12 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/findUsages/kotlin/findClassUsages"), Pattern.compile("^(.+)\\.0\\.kt$"), true); } + @TestMetadata("classUsedInPlainText.0.kt") + public void testClassUsedInPlainText() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findClassUsages/classUsedInPlainText.0.kt"); + doTest(fileName); + } + @TestMetadata("classUsedInTextAsRef.0.kt") public void testClassUsedInTextAsRef() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findClassUsages/classUsedInTextAsRef.0.kt"); @@ -456,6 +462,12 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { doTest(fileName); } + @TestMetadata("functionUsedInPlainText.0.kt") + public void testFunctionUsedInPlainText() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findFunctionUsages/functionUsedInPlainText.0.kt"); + doTest(fileName); + } + @TestMetadata("javaAndKotlinOverrides.0.kt") public void testJavaAndKotlinOverrides() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findFunctionUsages/javaAndKotlinOverrides.0.kt");