diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFunctionProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFunctionProcessor.kt index 6b5f33d4210..f15bb137afe 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFunctionProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFunctionProcessor.kt @@ -20,11 +20,15 @@ import com.intellij.openapi.editor.Editor import com.intellij.psi.PsiElement import com.intellij.psi.PsiMethod import com.intellij.psi.search.SearchScope +import com.intellij.refactoring.listeners.RefactoringElementListener import com.intellij.refactoring.rename.RenameJavaMethodProcessor +import com.intellij.usageView.UsageInfo import org.jetbrains.kotlin.asJava.KotlinLightMethod import org.jetbrains.kotlin.asJava.LightClassUtil +import org.jetbrains.kotlin.asJava.unwrapped import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.psi.JetFunction +import org.jetbrains.kotlin.psi.JetNamedDeclaration import org.jetbrains.kotlin.psi.JetNamedFunction import org.jetbrains.kotlin.psi.JetSecondaryConstructor @@ -57,6 +61,12 @@ public class RenameKotlinFunctionProcessor : RenameKotlinPsiProcessor() { } } + override fun renameElement(element: PsiElement?, newName: String?, usages: Array?, listener: RefactoringElementListener?) { + super.renameElement(element, newName, usages, listener) + + (element?.unwrapped as? JetNamedDeclaration)?.let { dropOverrideKeywordIfNecessary(it) } + } + private fun wrapPsiMethod(element: PsiElement?): PsiMethod? = when (element) { is KotlinLightMethod -> element is JetNamedFunction, is JetSecondaryConstructor -> runReadAction { diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPropertyProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPropertyProcessor.kt index 8f4b71d0c93..96e949cb6f3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPropertyProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPropertyProcessor.kt @@ -32,17 +32,16 @@ import com.intellij.refactoring.util.RefactoringUtil import com.intellij.usageView.UsageInfo import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.namedUnwrappedElement +import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.lexer.JetTokens import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.psi.JetCallableDeclaration -import org.jetbrains.kotlin.psi.JetClassOrObject -import org.jetbrains.kotlin.psi.JetParameter -import org.jetbrains.kotlin.psi.JetProperty +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.OverrideResolver @@ -113,7 +112,7 @@ public class RenameKotlinPropertyProcessor : RenamePsiElementProcessor() { return } - val name = (element as PsiNamedElement).getName()!! + val name = (element as JetNamedDeclaration).getName()!! val oldGetterName = JvmAbi.getterName(name) val oldSetterName = JvmAbi.setterName(name) @@ -143,6 +142,8 @@ public class RenameKotlinPropertyProcessor : RenamePsiElementProcessor() { refKindUsages[UsageKind.SIMPLE_PROPERTY_USAGE]?.toTypedArray() ?: arrayOf(), null) + dropOverrideKeywordIfNecessary(element) + listener?.elementRenamed(element) } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameUtil.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameUtil.kt index d6dbfc7f1dd..d325eedcdfe 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameUtil.kt @@ -21,8 +21,12 @@ import com.intellij.usageView.UsageInfo import java.util.ArrayList import com.intellij.refactoring.util.MoveRenameUsageInfo import com.intellij.refactoring.rename.UnresolvableCollisionUsageInfo +import org.jetbrains.kotlin.descriptors.CallableDescriptor +import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.refactoring.JetRefactoringBundle import org.jetbrains.kotlin.idea.references.AbstractJetReference +import org.jetbrains.kotlin.lexer.JetTokens +import org.jetbrains.kotlin.psi.JetNamedDeclaration fun checkConflictsAndReplaceUsageInfos(result: MutableList) { val usagesToAdd = ArrayList() @@ -50,3 +54,9 @@ class UnresolvableConventionViolationUsageInfo( ) : UnresolvableCollisionUsageInfo(element, referencedElement) { override fun getDescription(): String = JetRefactoringBundle.message("naming.convention.will.be.violated.after.rename") } + +fun dropOverrideKeywordIfNecessary(element: JetNamedDeclaration) { + if ((element.resolveToDescriptor() as CallableDescriptor).overriddenDescriptors.isEmpty()) { + element.removeModifier(JetTokens.OVERRIDE_KEYWORD) + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameEquals/after/equals.kt b/idea/testData/refactoring/rename/renameEquals/after/equals.kt index e48e4e842da..08078be96fb 100644 --- a/idea/testData/refactoring/rename/renameEquals/after/equals.kt +++ b/idea/testData/refactoring/rename/renameEquals/after/equals.kt @@ -1,5 +1,5 @@ class A(val n: Int) { - override fun foo(other: Any?): Boolean = other is A && other.n == n + fun foo(other: Any?): Boolean = other is A && other.n == n } fun test() {