From 021c88e5ff207dfc774511693761fa6311a0c622 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 19 Apr 2016 15:13:31 +0300 Subject: [PATCH] Find Usages: Fixed searching of Java usages for @JvmStatic properties and @JvmStatic @JvmOverloads functions #KT-11736 Fixed --- ChangeLog.md | 1 + .../KotlinReferencesSearcher.kt | 31 ++++++++++--------- .../findFunctionUsages/jvmStaticFun.0.kt | 9 ++++++ .../findFunctionUsages/jvmStaticFun.1.java | 5 +++ .../jvmStaticFun.results.txt | 1 + .../jvmStaticJvmOverloadsFun.0.kt | 11 +++++++ .../jvmStaticJvmOverloadsFun.1.java | 6 ++++ .../jvmStaticJvmOverloadsFun.results.txt | 2 ++ .../findPropertyUsages/jvmStaticProperty.0.kt | 7 +++++ .../jvmStaticProperty.1.java | 6 ++++ .../jvmStaticProperty.results.txt | 2 ++ ...enameKotlinStaticMethodWithJvmOverloads.kt | 9 ++++++ .../after/testing/JavaClient.java | 10 ++++++ ...enameKotlinStaticMethodWithJvmOverloads.kt | 9 ++++++ .../before/testing/JavaClient.java | 10 ++++++ ...ameKotlinStaticMethodWithJvmOverloads.test | 7 +++++ .../after/RenameKotlinStaticProperty.kt | 7 +++++ .../after/testing/JavaClient.java | 10 ++++++ .../before/RenameKotlinStaticProperty.kt | 7 +++++ .../before/testing/JavaClient.java | 10 ++++++ .../renameKotlinStaticProperty.test | 7 +++++ .../findUsages/FindUsagesTestGenerated.java | 18 +++++++++++ .../rename/RenameTestGenerated.java | 12 +++++++ 23 files changed, 182 insertions(+), 15 deletions(-) create mode 100644 idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticFun.0.kt create mode 100644 idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticFun.1.java create mode 100644 idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticFun.results.txt create mode 100644 idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticJvmOverloadsFun.0.kt create mode 100644 idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticJvmOverloadsFun.1.java create mode 100644 idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticJvmOverloadsFun.results.txt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/jvmStaticProperty.0.kt create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/jvmStaticProperty.1.java create mode 100644 idea/testData/findUsages/kotlin/findPropertyUsages/jvmStaticProperty.results.txt create mode 100644 idea/testData/refactoring/rename/renameKotlinStaticMethodWithJvmOverloads/after/RenameKotlinStaticMethodWithJvmOverloads.kt create mode 100644 idea/testData/refactoring/rename/renameKotlinStaticMethodWithJvmOverloads/after/testing/JavaClient.java create mode 100644 idea/testData/refactoring/rename/renameKotlinStaticMethodWithJvmOverloads/before/RenameKotlinStaticMethodWithJvmOverloads.kt create mode 100644 idea/testData/refactoring/rename/renameKotlinStaticMethodWithJvmOverloads/before/testing/JavaClient.java create mode 100644 idea/testData/refactoring/rename/renameKotlinStaticMethodWithJvmOverloads/renameKotlinStaticMethodWithJvmOverloads.test create mode 100644 idea/testData/refactoring/rename/renameKotlinStaticProperty/after/RenameKotlinStaticProperty.kt create mode 100644 idea/testData/refactoring/rename/renameKotlinStaticProperty/after/testing/JavaClient.java create mode 100644 idea/testData/refactoring/rename/renameKotlinStaticProperty/before/RenameKotlinStaticProperty.kt create mode 100644 idea/testData/refactoring/rename/renameKotlinStaticProperty/before/testing/JavaClient.java create mode 100644 idea/testData/refactoring/rename/renameKotlinStaticProperty/renameKotlinStaticProperty.test diff --git a/ChangeLog.md b/ChangeLog.md index c333ed6cc2c..3603a794bd8 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -27,6 +27,7 @@ Issues fixed: - [KT-11866](https://youtrack.jetbrains.com/issue/KT-11866) Suggest "Create secondary constructor" when constructors exist but are not applicable - [KT-11908](https://youtrack.jetbrains.com/issue/KT-11866) Allow properties with custom setters to be used in generated equals/hashCode/toString - [KT-11845](https://youtrack.jetbrains.com/issue/KT-11845) Fixed exception on attempt to find derived classes +- [KT-11736](https://youtrack.jetbrains.com/issue/KT-11736) Fixed searching of Java usages for @JvmStatic properties and @JvmStatic @JvmOverloads functions #### Debugger diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferencesSearcher.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferencesSearcher.kt index 1ec679790c6..229e8dc83dc 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferencesSearcher.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferencesSearcher.kt @@ -210,17 +210,22 @@ class KotlinReferencesSearcher : QueryExecutorBase { + val originObject = declaration.parents .dropWhile { it is KtClassBody } - .firstOrNull() as? KtObjectDeclaration ?: return null + .firstOrNull() as? KtObjectDeclaration ?: return emptyList() if (originObject.isCompanion()) { val originClass = originObject.getStrictParentOfType() - val originLightClass = originClass?.toLightClass() - val allMethods = originLightClass?.allMethods - return allMethods?.find { it is KtLightMethod && it.kotlinOrigin == function } + val originLightClass = originClass?.toLightClass() ?: return emptyList() + val allMethods = originLightClass.allMethods + return allMethods.filter { it is KtLightMethod && it.kotlinOrigin == declaration } } - return null + return emptyList() + } + + private fun processStaticsFromCompanionObject(element: KtDeclaration, queryParameters: ReferencesSearch.SearchParameters) { + val staticsFromCompanionObject = runReadAction { findStaticMethodsFromCompanionObject(element) } + staticsFromCompanionObject.forEach { searchNamedElement(queryParameters, it) } } private fun searchPropertyMethods(queryParameters: ReferencesSearch.SearchParameters, parameter: KtParameter) { @@ -252,15 +257,13 @@ class KotlinReferencesSearcher : QueryExecutorBase { val propertyMethods = runReadAction { LightClassUtil.getLightClassPropertyMethods(element) } propertyMethods.allDeclarations.forEach { searchNamedElement(queryParameters, it) } + processStaticsFromCompanionObject(element, queryParameters) } is KtParameter -> { @@ -278,16 +281,14 @@ class KotlinReferencesSearcher : QueryExecutorBase() searchNamedElement(queryParameters, property) } else if (declaration is KtFunction) { - val staticFromCompanionObject = runReadAction { findStaticMethodFromCompanionObject(declaration) } - if (staticFromCompanionObject != null) { - searchNamedElement(queryParameters, staticFromCompanionObject) - } + processStaticsFromCompanionObject(declaration, queryParameters) } } diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticFun.0.kt b/idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticFun.0.kt new file mode 100644 index 00000000000..b71d57e7aa2 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticFun.0.kt @@ -0,0 +1,9 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.KtNamedFunction +// OPTIONS: usages +class Foo { + companion object { + @JvmStatic fun foo() { + + } + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticFun.1.java b/idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticFun.1.java new file mode 100644 index 00000000000..7835abd709c --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticFun.1.java @@ -0,0 +1,5 @@ +class Bar { + { + Foo.foo(); + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticFun.results.txt b/idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticFun.results.txt new file mode 100644 index 00000000000..12b53897fec --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticFun.results.txt @@ -0,0 +1 @@ +Unclassified usage 3 Foo.foo(); \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticJvmOverloadsFun.0.kt b/idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticJvmOverloadsFun.0.kt new file mode 100644 index 00000000000..37203fbd4c3 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticJvmOverloadsFun.0.kt @@ -0,0 +1,11 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.KtNamedFunction +// OPTIONS: usages +class Foo { + companion object { + @JvmStatic + @JvmOverloads + fun foo(n: Int = 1) { + + } + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticJvmOverloadsFun.1.java b/idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticJvmOverloadsFun.1.java new file mode 100644 index 00000000000..ee1ffe2f3eb --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticJvmOverloadsFun.1.java @@ -0,0 +1,6 @@ +class Bar { + { + Foo.foo(2); + Foo.foo(); + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticJvmOverloadsFun.results.txt b/idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticJvmOverloadsFun.results.txt new file mode 100644 index 00000000000..affa2fbc77e --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticJvmOverloadsFun.results.txt @@ -0,0 +1,2 @@ +Unclassified usage 3 Foo.foo(2); +Unclassified usage 4 Foo.foo(); \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/jvmStaticProperty.0.kt b/idea/testData/findUsages/kotlin/findPropertyUsages/jvmStaticProperty.0.kt new file mode 100644 index 00000000000..99d858a059e --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/jvmStaticProperty.0.kt @@ -0,0 +1,7 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.KtProperty +// OPTIONS: usages +class Foo { + companion object { + @JvmStatic var foo = 1 + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/jvmStaticProperty.1.java b/idea/testData/findUsages/kotlin/findPropertyUsages/jvmStaticProperty.1.java new file mode 100644 index 00000000000..7b0a76be264 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/jvmStaticProperty.1.java @@ -0,0 +1,6 @@ +class Bar { + { + Foo.getFoo(); + Foo.setFoo(2); + } +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/jvmStaticProperty.results.txt b/idea/testData/findUsages/kotlin/findPropertyUsages/jvmStaticProperty.results.txt new file mode 100644 index 00000000000..50608d45f83 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/jvmStaticProperty.results.txt @@ -0,0 +1,2 @@ +Unclassified usage 3 Foo.getFoo(); +Unclassified usage 4 Foo.setFoo(2); \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameKotlinStaticMethodWithJvmOverloads/after/RenameKotlinStaticMethodWithJvmOverloads.kt b/idea/testData/refactoring/rename/renameKotlinStaticMethodWithJvmOverloads/after/RenameKotlinStaticMethodWithJvmOverloads.kt new file mode 100644 index 00000000000..c62bd2ecd01 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinStaticMethodWithJvmOverloads/after/RenameKotlinStaticMethodWithJvmOverloads.kt @@ -0,0 +1,9 @@ +package testing.rename + +public open class C { + companion object { + @JvmStatic + @JvmOverloads + fun second(n: Int = 1) {} + } +} diff --git a/idea/testData/refactoring/rename/renameKotlinStaticMethodWithJvmOverloads/after/testing/JavaClient.java b/idea/testData/refactoring/rename/renameKotlinStaticMethodWithJvmOverloads/after/testing/JavaClient.java new file mode 100644 index 00000000000..ca07e0f01c8 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinStaticMethodWithJvmOverloads/after/testing/JavaClient.java @@ -0,0 +1,10 @@ +package testing; + +import testing.rename.C; + +class JavaClient { + public void foo() { + C.second(2); + C.second(); + } +} diff --git a/idea/testData/refactoring/rename/renameKotlinStaticMethodWithJvmOverloads/before/RenameKotlinStaticMethodWithJvmOverloads.kt b/idea/testData/refactoring/rename/renameKotlinStaticMethodWithJvmOverloads/before/RenameKotlinStaticMethodWithJvmOverloads.kt new file mode 100644 index 00000000000..a058bf1159f --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinStaticMethodWithJvmOverloads/before/RenameKotlinStaticMethodWithJvmOverloads.kt @@ -0,0 +1,9 @@ +package testing.rename + +public open class C { + companion object { + @JvmStatic + @JvmOverloads + fun first(n: Int = 1) {} + } +} diff --git a/idea/testData/refactoring/rename/renameKotlinStaticMethodWithJvmOverloads/before/testing/JavaClient.java b/idea/testData/refactoring/rename/renameKotlinStaticMethodWithJvmOverloads/before/testing/JavaClient.java new file mode 100644 index 00000000000..96f73d4ce3b --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinStaticMethodWithJvmOverloads/before/testing/JavaClient.java @@ -0,0 +1,10 @@ +package testing; + +import testing.rename.C; + +class JavaClient { + public void foo() { + C.first(2); + C.first(); + } +} diff --git a/idea/testData/refactoring/rename/renameKotlinStaticMethodWithJvmOverloads/renameKotlinStaticMethodWithJvmOverloads.test b/idea/testData/refactoring/rename/renameKotlinStaticMethodWithJvmOverloads/renameKotlinStaticMethodWithJvmOverloads.test new file mode 100644 index 00000000000..58bf71b7e90 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinStaticMethodWithJvmOverloads/renameKotlinStaticMethodWithJvmOverloads.test @@ -0,0 +1,7 @@ +{ + "type": "KOTLIN_FUNCTION", + "classId": "testing/rename/C.Companion", + "oldName": "first", + "newName": "second", + "withRuntime": "true" +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameKotlinStaticProperty/after/RenameKotlinStaticProperty.kt b/idea/testData/refactoring/rename/renameKotlinStaticProperty/after/RenameKotlinStaticProperty.kt new file mode 100644 index 00000000000..38260f25130 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinStaticProperty/after/RenameKotlinStaticProperty.kt @@ -0,0 +1,7 @@ +package testing.rename + +public open class C { + companion object { + @JvmStatic var second = 1 + } +} diff --git a/idea/testData/refactoring/rename/renameKotlinStaticProperty/after/testing/JavaClient.java b/idea/testData/refactoring/rename/renameKotlinStaticProperty/after/testing/JavaClient.java new file mode 100644 index 00000000000..45eea29ca44 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinStaticProperty/after/testing/JavaClient.java @@ -0,0 +1,10 @@ +package testing; + +import testing.rename.C; + +class JavaClient { + public void foo() { + C.getSecond(); + C.setSecond(2); + } +} diff --git a/idea/testData/refactoring/rename/renameKotlinStaticProperty/before/RenameKotlinStaticProperty.kt b/idea/testData/refactoring/rename/renameKotlinStaticProperty/before/RenameKotlinStaticProperty.kt new file mode 100644 index 00000000000..6c579545960 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinStaticProperty/before/RenameKotlinStaticProperty.kt @@ -0,0 +1,7 @@ +package testing.rename + +public open class C { + companion object { + @JvmStatic var first = 1 + } +} diff --git a/idea/testData/refactoring/rename/renameKotlinStaticProperty/before/testing/JavaClient.java b/idea/testData/refactoring/rename/renameKotlinStaticProperty/before/testing/JavaClient.java new file mode 100644 index 00000000000..9c497a23fe0 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinStaticProperty/before/testing/JavaClient.java @@ -0,0 +1,10 @@ +package testing; + +import testing.rename.C; + +class JavaClient { + public void foo() { + C.getFirst(); + C.setFirst(2); + } +} diff --git a/idea/testData/refactoring/rename/renameKotlinStaticProperty/renameKotlinStaticProperty.test b/idea/testData/refactoring/rename/renameKotlinStaticProperty/renameKotlinStaticProperty.test new file mode 100644 index 00000000000..931ffe1fa3d --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinStaticProperty/renameKotlinStaticProperty.test @@ -0,0 +1,7 @@ +{ + "type": "KOTLIN_PROPERTY", + "classId": "testing/rename/C.Companion", + "oldName": "first", + "newName": "second", + "withRuntime": "true" +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java b/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java index 7f365b74a4e..e062ca16a9b 100644 --- a/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java @@ -558,6 +558,18 @@ public class FindUsagesTestGenerated extends AbstractFindUsagesTest { doTest(fileName); } + @TestMetadata("jvmStaticFun.0.kt") + public void testJvmStaticFun() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticFun.0.kt"); + doTest(fileName); + } + + @TestMetadata("jvmStaticJvmOverloadsFun.0.kt") + public void testJvmStaticJvmOverloadsFun() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findFunctionUsages/jvmStaticJvmOverloadsFun.0.kt"); + doTest(fileName); + } + @TestMetadata("kotlinInternalMethodUsages.0.kt") public void testKotlinInternalMethodUsages() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findFunctionUsages/kotlinInternalMethodUsages.0.kt"); @@ -912,6 +924,12 @@ public class FindUsagesTestGenerated extends AbstractFindUsagesTest { doTest(fileName); } + @TestMetadata("jvmStaticProperty.0.kt") + public void testJvmStaticProperty() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findPropertyUsages/jvmStaticProperty.0.kt"); + doTest(fileName); + } + @TestMetadata("kotlinClassObjectPropertyUsage.0.kt") public void testKotlinClassObjectPropertyUsage() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findPropertyUsages/kotlinClassObjectPropertyUsage.0.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java index 5046800fb0e..3bcacebaf87 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java @@ -371,6 +371,18 @@ public class RenameTestGenerated extends AbstractRenameTest { doTest(fileName); } + @TestMetadata("renameKotlinStaticMethodWithJvmOverloads/renameKotlinStaticMethodWithJvmOverloads.test") + public void testRenameKotlinStaticMethodWithJvmOverloads_RenameKotlinStaticMethodWithJvmOverloads() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinStaticMethodWithJvmOverloads/renameKotlinStaticMethodWithJvmOverloads.test"); + doTest(fileName); + } + + @TestMetadata("renameKotlinStaticProperty/renameKotlinStaticProperty.test") + public void testRenameKotlinStaticProperty_RenameKotlinStaticProperty() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinStaticProperty/renameKotlinStaticProperty.test"); + doTest(fileName); + } + @TestMetadata("renameKotlinTopLevelVarProperty/renameTopLevelVarProperty.test") public void testRenameKotlinTopLevelVarProperty_RenameTopLevelVarProperty() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinTopLevelVarProperty/renameTopLevelVarProperty.test");