diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/KotlinCallableDefinitionUsage.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/KotlinCallableDefinitionUsage.kt index 9a26280d64f..9482e1cbf50 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/KotlinCallableDefinitionUsage.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/KotlinCallableDefinitionUsage.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.getJavaMethodDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.codeInsight.shorten.addToShorteningWaitSet import org.jetbrains.kotlin.idea.core.refactoring.createPrimaryConstructorIfAbsent +import org.jetbrains.kotlin.idea.core.refactoring.dropOverrideKeywordIfNecessary import org.jetbrains.kotlin.idea.core.refactoring.replaceListPsiAndKeepDelimiters import org.jetbrains.kotlin.idea.core.setVisibility import org.jetbrains.kotlin.idea.core.toKeywordToken @@ -52,7 +53,8 @@ class KotlinCallableDefinitionUsage( function: T, val originalCallableDescriptor: CallableDescriptor, baseFunction: KotlinCallableDefinitionUsage?, - private val samCallType: KotlinType? + private val samCallType: KotlinType?, + private val canDropOverride: Boolean = true ) : KotlinUsageInfo(function) { val baseFunction: KotlinCallableDefinitionUsage<*> = baseFunction ?: this @@ -139,6 +141,10 @@ class KotlinCallableDefinitionUsage( changeVisibility(changeInfo, element) } + if (canDropOverride) { + dropOverrideKeywordIfNecessary(element) + } + return true } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterMethodUsageProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterMethodUsageProcessor.kt index 2c2d208acc6..7b265f5ffae 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterMethodUsageProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterMethodUsageProcessor.kt @@ -25,11 +25,11 @@ import com.intellij.refactoring.introduceParameter.IntroduceParameterMethodUsage import com.intellij.usageView.UsageInfo import com.intellij.util.containers.MultiMap import org.jetbrains.kotlin.asJava.unwrapped -import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.caches.resolve.getJavaMethodDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor +import org.jetbrains.kotlin.idea.core.refactoring.dropOverrideKeywordIfNecessary import org.jetbrains.kotlin.idea.core.refactoring.j2k import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinChangeInfo import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinChangeSignatureData @@ -45,7 +45,7 @@ import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypeAndBranch import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns -import java.util.Collections +import java.util.* public class KotlinIntroduceParameterMethodUsageProcessor : IntroduceParameterMethodUsagesProcessor { override fun isMethodUsage(usage: UsageInfo): Boolean = (usage.getElement() as? KtElement)?.let { @@ -92,7 +92,9 @@ public class KotlinIntroduceParameterMethodUsageProcessor : IntroduceParameterMe .map { it.unwrapped } .filterIsInstance() return (kotlinFunctions + element).all { - KotlinCallableDefinitionUsage(it, changeInfo.originalBaseFunctionDescriptor, null, null).processUsage(changeInfo, it, usages) + KotlinCallableDefinitionUsage(it, changeInfo.originalBaseFunctionDescriptor, null, null, false).processUsage(changeInfo, it, usages) + }.apply { + dropOverrideKeywordIfNecessary(element) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt index 6d9d7cbaeb7..2f0fcf9deaa 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/jetRefactoringUtil.kt @@ -59,6 +59,7 @@ import com.intellij.util.VisibilityUtil import com.intellij.util.containers.MultiMap import org.jetbrains.kotlin.asJava.KtLightMethod import org.jetbrains.kotlin.asJava.LightClassUtil +import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.FunctionDescriptor @@ -74,6 +75,7 @@ import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.idea.util.string.collapseSpaces import org.jetbrains.kotlin.j2k.ConverterSettings import org.jetbrains.kotlin.j2k.JavaToKotlinConverter +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.codeFragmentUtil.suppressDiagnosticsInDebugMode @@ -760,4 +762,11 @@ fun KtExpression.removeTemplateEntryBracesIfPossible(): KtExpression { val intention = RemoveCurlyBracesFromTemplateIntention() val newEntry = if (intention.isApplicableTo(parent)) intention.applyTo(parent) else parent return newEntry.expression!! +} + +fun dropOverrideKeywordIfNecessary(element: KtNamedDeclaration) { + val callableDescriptor = element.resolveToDescriptor() as? CallableDescriptor ?: return + if (callableDescriptor.overriddenDescriptors.isEmpty()) { + element.removeModifier(KtTokens.OVERRIDE_KEYWORD) + } } \ No newline at end of file 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 75e463b48b1..ec32123a38c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFunctionProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFunctionProcessor.kt @@ -26,6 +26,7 @@ import com.intellij.usageView.UsageInfo import org.jetbrains.kotlin.asJava.KtLightMethod import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.unwrapped +import org.jetbrains.kotlin.idea.core.refactoring.dropOverrideKeywordIfNecessary import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.KtNamedDeclaration 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 3c87550b6a1..56b64b3a3a3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPropertyProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPropertyProcessor.kt @@ -37,6 +37,7 @@ 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.core.refactoring.dropOverrideKeywordIfNecessary import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.load.java.JvmAbi 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 30791a95519..5aab7fab480 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameUtil.kt @@ -20,12 +20,8 @@ import com.intellij.psi.PsiElement import com.intellij.refactoring.rename.UnresolvableCollisionUsageInfo import com.intellij.refactoring.util.MoveRenameUsageInfo import com.intellij.usageView.UsageInfo -import org.jetbrains.kotlin.descriptors.CallableDescriptor -import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.refactoring.KotlinRefactoringBundle import org.jetbrains.kotlin.idea.references.AbstractKtReference -import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.psi.KtNamedDeclaration import java.util.* fun checkConflictsAndReplaceUsageInfos(result: MutableList) { @@ -54,9 +50,3 @@ class UnresolvableConventionViolationUsageInfo( ) : UnresolvableCollisionUsageInfo(element, referencedElement) { override fun getDescription(): String = KotlinRefactoringBundle.message("naming.convention.will.be.violated.after.rename") } - -fun dropOverrideKeywordIfNecessary(element: KtNamedDeclaration) { - if ((element.resolveToDescriptor() as CallableDescriptor).overriddenDescriptors.isEmpty()) { - element.removeModifier(KtTokens.OVERRIDE_KEYWORD) - } -} \ No newline at end of file