diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/declarationsSearch/overridersSearch.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/declarationsSearch/overridersSearch.kt index 88781660d08..982127576fa 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/declarationsSearch/overridersSearch.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/declarationsSearch/overridersSearch.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.idea.caches.lightClasses.KtFakeLightClass import org.jetbrains.kotlin.idea.caches.lightClasses.KtFakeLightMethod import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor +import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.idea.core.getDeepestSuperDeclarations import org.jetbrains.kotlin.idea.core.isOverridable import org.jetbrains.kotlin.idea.search.allScope @@ -206,7 +207,9 @@ fun findDeepestSuperMethodsNoWrapping(method: PsiElement): List { is PsiMethod -> element.findDeepestSuperMethods().toList() is KtCallableDeclaration -> { val descriptor = element.resolveToDescriptorIfAny() as? CallableMemberDescriptor ?: return emptyList() - descriptor.getDeepestSuperDeclarations(false).mapNotNull { it.source.getPsi() } + descriptor.getDeepestSuperDeclarations(false).mapNotNull { + it.source.getPsi() ?: DescriptorToSourceUtilsIde.getAnyDeclaration(element.project, it) + } } else -> emptyList() } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/kotlinRefactoringUtil.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/kotlinRefactoringUtil.kt index 1fe4a84012c..c47a3703a87 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/kotlinRefactoringUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/kotlinRefactoringUtil.kt @@ -41,10 +41,10 @@ import com.intellij.refactoring.BaseRefactoringProcessor.ConflictsInTestsExcepti import com.intellij.refactoring.changeSignature.ChangeSignatureUtil import com.intellij.refactoring.listeners.RefactoringEventData import com.intellij.refactoring.listeners.RefactoringEventListener +import com.intellij.refactoring.rename.PsiElementRenameHandler import com.intellij.refactoring.ui.ConflictsDialog import com.intellij.refactoring.util.ConflictsUtil import com.intellij.refactoring.util.RefactoringUIUtil -import com.intellij.refactoring.rename.PsiElementRenameHandler import com.intellij.ui.components.JBList import com.intellij.usageView.UsageViewTypeLocation import com.intellij.util.VisibilityUtil 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 a77618c1015..b428e725fa3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFunctionProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFunctionProcessor.kt @@ -11,10 +11,8 @@ import com.intellij.openapi.util.Pass import com.intellij.psi.* import com.intellij.psi.search.SearchScope import com.intellij.refactoring.listeners.RefactoringElementListener -import com.intellij.refactoring.rename.RenameDialog -import com.intellij.refactoring.rename.RenameJavaMethodProcessor -import com.intellij.refactoring.rename.RenameProcessor -import com.intellij.refactoring.rename.RenameUtil +import com.intellij.refactoring.rename.* +import com.intellij.refactoring.util.CommonRefactoringUtil import com.intellij.refactoring.util.RefactoringUtil import com.intellij.usageView.UsageInfo import com.intellij.util.SmartList @@ -122,7 +120,13 @@ class RenameKotlinFunctionProcessor : RenameKotlinPsiProcessor() { return substitutedJavaElement.kotlinOrigin as? KtNamedFunction } - return substitutedJavaElement + val canRename = try { + PsiElementRenameHandler.canRename(element.project, editor, substitutedJavaElement) + } catch (e: CommonRefactoringUtil.RefactoringErrorHintException) { + false + } + + return if (canRename) substitutedJavaElement else element } override fun substituteElementToRename(element: PsiElement, editor: Editor, renameCallback: Pass) { diff --git a/idea/testData/refactoring/rename/renameKotlinBaseMethodWithBinaryBase/after/renameKotlinBaseMethodWithBinaryBase.kt b/idea/testData/refactoring/rename/renameKotlinBaseMethodWithBinaryBase/after/renameKotlinBaseMethodWithBinaryBase.kt new file mode 100644 index 00000000000..248081b84dd --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinBaseMethodWithBinaryBase/after/renameKotlinBaseMethodWithBinaryBase.kt @@ -0,0 +1,13 @@ +package testing.rename + +interface A : Runnable { + override fun run() { + TODO("Not yet implemented") + } +} + +public open class B: A { + fun lol() { + + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameKotlinBaseMethodWithBinaryBase/before/renameKotlinBaseMethodWithBinaryBase.kt b/idea/testData/refactoring/rename/renameKotlinBaseMethodWithBinaryBase/before/renameKotlinBaseMethodWithBinaryBase.kt new file mode 100644 index 00000000000..c8f8c7f19de --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinBaseMethodWithBinaryBase/before/renameKotlinBaseMethodWithBinaryBase.kt @@ -0,0 +1,13 @@ +package testing.rename + +interface A : Runnable { + override fun run() { + TODO("Not yet implemented") + } +} + +public open class B: A { + override fun run() { + + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameKotlinBaseMethodWithBinaryBase/kotlinBaseFunction.test b/idea/testData/refactoring/rename/renameKotlinBaseMethodWithBinaryBase/kotlinBaseFunction.test new file mode 100644 index 00000000000..e79e3b5ed88 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinBaseMethodWithBinaryBase/kotlinBaseFunction.test @@ -0,0 +1,7 @@ +{ + "type": "KOTLIN_FUNCTION", + "classId": "testing/rename/B", + "oldName": "run", + "newName": "lol", + "comment": "Rename method with binary function overridden" +} \ No newline at end of file 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 2e76b9da383..123bcd37c11 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java @@ -698,6 +698,11 @@ public class RenameTestGenerated extends AbstractRenameTest { runTest("idea/testData/refactoring/rename/renameKotlinBaseMethod/kotlinBaseFunction.test"); } + @TestMetadata("renameKotlinBaseMethodWithBinaryBase/kotlinBaseFunction.test") + public void testRenameKotlinBaseMethodWithBinaryBase_KotlinBaseFunction() throws Exception { + runTest("idea/testData/refactoring/rename/renameKotlinBaseMethodWithBinaryBase/kotlinBaseFunction.test"); + } + @TestMetadata("renameKotlinClass/javaWrapperForKotlinClass.test") public void testRenameKotlinClass_JavaWrapperForKotlinClass() throws Exception { runTest("idea/testData/refactoring/rename/renameKotlinClass/javaWrapperForKotlinClass.test");