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 44dd0bb5cfc..910196b0bae 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 @@ -38,6 +38,8 @@ import org.jetbrains.kotlin.idea.stubindex.JetSourceFilterScope import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType +import org.jetbrains.kotlin.psi.psiUtil.parents public class KotlinReferencesSearcher : QueryExecutorBase() { @@ -136,6 +138,19 @@ public class KotlinReferencesSearcher : QueryExecutorBase() + val originLightClass = LightClassUtil.getPsiClass(originClass) + val allMethods = originLightClass?.allMethods + return allMethods?.find { it is KotlinLightMethod && it.getOrigin() == function } + } + return null + } + private fun searchLightElements(queryParameters: ReferencesSearch.SearchParameters, element: PsiElement) { when (element) { is JetClassOrObject -> processJetClassOrObject(element, queryParameters) @@ -146,6 +161,11 @@ public class KotlinReferencesSearcher : QueryExecutorBase { val propertyMethods = runReadAction { LightClassUtil.getLightClassPropertyMethods(element) } @@ -160,6 +180,12 @@ public class KotlinReferencesSearcher : QueryExecutorBase(declaration, javaClass())) } + else if (declaration is JetFunction) { + val staticFromCompanionObject = findStaticMethodFromCompanionObject(declaration) + if (staticFromCompanionObject != null) { + searchNamedElement(queryParameters, staticFromCompanionObject) + } + } } is KotlinLightParameter -> { val componentFunctionDescriptor = element.getOrigin()?.dataClassComponentFunction() diff --git a/idea/testData/refactoring/rename/renameKotlinStaticMethod/after/RenameKotlinStaticMethod.kt b/idea/testData/refactoring/rename/renameKotlinStaticMethod/after/RenameKotlinStaticMethod.kt new file mode 100644 index 00000000000..016e631db2c --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinStaticMethod/after/RenameKotlinStaticMethod.kt @@ -0,0 +1,7 @@ +package testing.rename + +public open class C { + companion object { + jvmStatic fun second() {} + } +} diff --git a/idea/testData/refactoring/rename/renameKotlinStaticMethod/after/testing/JavaClient.java b/idea/testData/refactoring/rename/renameKotlinStaticMethod/after/testing/JavaClient.java new file mode 100644 index 00000000000..5a840535d6b --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinStaticMethod/after/testing/JavaClient.java @@ -0,0 +1,9 @@ +package testing; + +import testing.rename.C; + +class JavaClient { + public void foo() { + C.second(); + } +} diff --git a/idea/testData/refactoring/rename/renameKotlinStaticMethod/before/RenameKotlinStaticMethod.kt b/idea/testData/refactoring/rename/renameKotlinStaticMethod/before/RenameKotlinStaticMethod.kt new file mode 100644 index 00000000000..806dfa1ff02 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinStaticMethod/before/RenameKotlinStaticMethod.kt @@ -0,0 +1,7 @@ +package testing.rename + +public open class C { + companion object { + jvmStatic fun first() {} + } +} diff --git a/idea/testData/refactoring/rename/renameKotlinStaticMethod/before/testing/JavaClient.java b/idea/testData/refactoring/rename/renameKotlinStaticMethod/before/testing/JavaClient.java new file mode 100644 index 00000000000..33683f928a2 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinStaticMethod/before/testing/JavaClient.java @@ -0,0 +1,9 @@ +package testing; + +import testing.rename.C; + +class JavaClient { + public void foo() { + C.first(); + } +} diff --git a/idea/testData/refactoring/rename/renameKotlinStaticMethod/renameKotlinStaticMethod.test b/idea/testData/refactoring/rename/renameKotlinStaticMethod/renameKotlinStaticMethod.test new file mode 100644 index 00000000000..58bf71b7e90 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinStaticMethod/renameKotlinStaticMethod.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/tests/org/jetbrains/kotlin/idea/refactoring/rename/AbstractRenameTest.kt b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/AbstractRenameTest.kt index 5186a4e5716..88ff97f3f2f 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/AbstractRenameTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/AbstractRenameTest.kt @@ -44,6 +44,7 @@ import org.jetbrains.kotlin.idea.jsonUtils.getNullableString import org.jetbrains.kotlin.idea.jsonUtils.getString import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.search.allScope +import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil import org.jetbrains.kotlin.idea.test.DirectiveBasedActionUtils import org.jetbrains.kotlin.idea.test.KotlinMultiFileTestCase import org.jetbrains.kotlin.idea.test.PluginTestCaseBase @@ -83,6 +84,11 @@ public abstract class AbstractRenameTest : KotlinMultiFileTestCase() { val hintDirective = renameObject.getNullableString("hint") + val withRuntime = renameObject.getNullableString("withRuntime") + if (withRuntime != null) { + ConfigLibraryUtil.configureKotlinRuntimeAndSdk(myModule, PluginTestCaseBase.mockJdk()) + } + try { val context = TestContext() 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 e42a34d80a6..af878e54101 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java @@ -311,6 +311,12 @@ public class RenameTestGenerated extends AbstractRenameTest { doTest(fileName); } + @TestMetadata("renameKotlinStaticMethod/renameKotlinStaticMethod.test") + public void testRenameKotlinStaticMethod_RenameKotlinStaticMethod() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinStaticMethod/renameKotlinStaticMethod.test"); + doTest(fileName); + } + @TestMetadata("renameKotlinValProperty/renameAsJavaGetterForExplicitGetter.test") public void testRenameKotlinValProperty_RenameAsJavaGetterForExplicitGetter() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinValProperty/renameAsJavaGetterForExplicitGetter.test");