Rename: Drop 'override' keyword when renaming function/property without bases

#KT-4790 Fixed
This commit is contained in:
Alexey Sedunov
2015-09-29 20:48:14 +03:00
parent 2f251b9216
commit 896e1d8bc9
4 changed files with 27 additions and 6 deletions
@@ -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<out UsageInfo>?, 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 {
@@ -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<UsageInfo>(),
null)
dropOverrideKeywordIfNecessary(element)
listener?.elementRenamed(element)
}
@@ -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<UsageInfo>) {
val usagesToAdd = ArrayList<UsageInfo>()
@@ -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)
}
}
@@ -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() {