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 e2262df8b40..ce9533e5726 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 @@ -169,10 +169,15 @@ public class KotlinReferencesSearcher : QueryExecutorBase { val propertyMethods = runReadAction { LightClassUtil.getLightClassPropertyMethods(element) } - searchNamedElement(queryParameters, propertyMethods.getGetter()) - searchNamedElement(queryParameters, propertyMethods.getSetter()) - searchNamedElement(queryParameters, propertyMethods.getBackingField()) - } + searchNamedElement(queryParameters, propertyMethods.getGetter()) + searchNamedElement(queryParameters, propertyMethods.getSetter()) + } + is JetParameter -> { + val propertyMethods = runReadAction { LightClassUtil.getLightClassPropertyMethods(element) } + searchNamedElement(queryParameters, propertyMethods.getGetter()) + searchNamedElement(queryParameters, propertyMethods.getSetter()) + searchNamedElement(queryParameters, propertyMethods.getBackingField()) + } is KotlinLightMethod -> { val declaration = element.getOrigin() if (declaration is JetProperty || (declaration is JetParameter && declaration.hasValOrVar())) { @@ -189,7 +194,8 @@ public class KotlinReferencesSearcher : QueryExecutorBase { - val componentFunctionDescriptor = element.getOrigin()?.dataClassComponentFunction() + val origin = element.getOrigin() ?: return + val componentFunctionDescriptor = origin.dataClassComponentFunction() if (componentFunctionDescriptor != null) { val containingClass = element.method.containingClass val componentFunction = containingClass?.methods?.find { @@ -199,6 +205,10 @@ public class KotlinReferencesSearcher : QueryExecutorBase, scope: SearchScope) { - val jetProperty = element?.namedUnwrappedElement as? JetProperty - if (jetProperty == null) throw IllegalStateException("Can't be for element $element there because of canProcessElement()") - - val propertyMethods = runReadAction { LightClassUtil.getLightClassPropertyMethods(jetProperty) } + val namedUnwrappedElement = element?.namedUnwrappedElement + val propertyMethods = when(namedUnwrappedElement) { + is JetProperty -> runReadAction { LightClassUtil.getLightClassPropertyMethods(namedUnwrappedElement) } + is JetParameter -> runReadAction { LightClassUtil.getLightClassPropertyMethods(namedUnwrappedElement) } + else -> throw IllegalStateException("Can't be for element $element there because of canProcessElement()") + } for (propertyMethod in propertyMethods) { - addRenameElements(propertyMethod, jetProperty.getName(), newName, allRenames, scope) + addRenameElements(propertyMethod, (element as PsiNamedElement).name, newName, allRenames, scope) } } @@ -99,12 +109,12 @@ public class RenameKotlinPropertyProcessor : RenamePsiElementProcessor() { } override fun renameElement(element: PsiElement?, newName: String?, usages: Array, listener: RefactoringElementListener?) { - if (element !is JetProperty) { + if (element !is JetProperty && element !is JetParameter) { super.renameElement(element, newName, usages, listener) return } - val name = element.getName()!! + val name = (element as PsiNamedElement).getName()!! val oldGetterName = JvmAbi.getterName(name) val oldSetterName = JvmAbi.setterName(name) diff --git a/idea/testData/refactoring/rename/renameKotlinPrimaryConstructorProperty/after/RenameKotlinPrimaryConstructorProperty.kt b/idea/testData/refactoring/rename/renameKotlinPrimaryConstructorProperty/after/RenameKotlinPrimaryConstructorProperty.kt new file mode 100644 index 00000000000..1a51aa953bf --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinPrimaryConstructorProperty/after/RenameKotlinPrimaryConstructorProperty.kt @@ -0,0 +1,3 @@ +package testing.rename + +public class Foo(public val /*rename*/second: String) diff --git a/idea/testData/refactoring/rename/renameKotlinPrimaryConstructorProperty/after/testing/JavaClient.java b/idea/testData/refactoring/rename/renameKotlinPrimaryConstructorProperty/after/testing/JavaClient.java new file mode 100644 index 00000000000..c49dae2ee8f --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinPrimaryConstructorProperty/after/testing/JavaClient.java @@ -0,0 +1,9 @@ +package testing; + +import testing.rename.*; + +class JavaClient { + public String foo(Foo f) { + return f.getSecond(); + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameKotlinPrimaryConstructorProperty/before/RenameKotlinPrimaryConstructorProperty.kt b/idea/testData/refactoring/rename/renameKotlinPrimaryConstructorProperty/before/RenameKotlinPrimaryConstructorProperty.kt new file mode 100644 index 00000000000..df2052a6011 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinPrimaryConstructorProperty/before/RenameKotlinPrimaryConstructorProperty.kt @@ -0,0 +1,3 @@ +package testing.rename + +public class Foo(public val /*rename*/first: String) diff --git a/idea/testData/refactoring/rename/renameKotlinPrimaryConstructorProperty/before/testing/JavaClient.java b/idea/testData/refactoring/rename/renameKotlinPrimaryConstructorProperty/before/testing/JavaClient.java new file mode 100644 index 00000000000..8966905e9ea --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinPrimaryConstructorProperty/before/testing/JavaClient.java @@ -0,0 +1,9 @@ +package testing; + +import testing.rename.*; + +class JavaClient { + public String foo(Foo f) { + return f.getFirst(); + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameKotlinPrimaryConstructorProperty/renameKotlinPrimaryConstructorProperty.test b/idea/testData/refactoring/rename/renameKotlinPrimaryConstructorProperty/renameKotlinPrimaryConstructorProperty.test new file mode 100644 index 00000000000..629c94888ce --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinPrimaryConstructorProperty/renameKotlinPrimaryConstructorProperty.test @@ -0,0 +1,5 @@ +{ + "type": "MARKED_ELEMENT", + "newName": "second", + "mainFile": "RenameKotlinPrimaryConstructorProperty.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 484e1a4f9a0..57993448e13 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("renameKotlinPrimaryConstructorProperty/renameKotlinPrimaryConstructorProperty.test") + public void testRenameKotlinPrimaryConstructorProperty_RenameKotlinPrimaryConstructorProperty() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinPrimaryConstructorProperty/renameKotlinPrimaryConstructorProperty.test"); + doTest(fileName); + } + @TestMetadata("renameKotlinStaticMethod/renameKotlinStaticMethod.test") public void testRenameKotlinStaticMethod_RenameKotlinStaticMethod() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinStaticMethod/renameKotlinStaticMethod.test");