diff --git a/ChangeLog.md b/ChangeLog.md index bee50a86def..d37263e1537 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -254,6 +254,7 @@ - [`KT-10033`](https://youtrack.jetbrains.com/issue/KT-10033) Qualify references to members of enum companions in case of conflict with enum entries - [`KT-10713`](https://youtrack.jetbrains.com/issue/KT-10713) Skip read-only declarations when renaming parameters - [`KT-10687`](https://youtrack.jetbrains.com/issue/KT-10687) Qualify property references to avoid shadowing by parameters +- [`KT-11903`](https://youtrack.jetbrains.com/issue/KT-11903) Update references to facade class when renaming file via matching top-level class - [`KT-12411`](https://youtrack.jetbrains.com/issue/KT-12411) Fix package name quotation in Move refactoring - [`KT-12543`](https://youtrack.jetbrains.com/issue/KT-12543) Qualify property references with 'this' to avoid renaming conflicts - [`KT-12732`](https://youtrack.jetbrains.com/issue/KT-12732) Copy default parameter values to overriding function which is renamed by Java reference while its base function is unchanged diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassDataProvider.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassDataProvider.kt index bafb8ea3954..4d3eba42eda 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassDataProvider.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassDataProvider.kt @@ -69,6 +69,7 @@ abstract class LightClassDataProvider( abstract val isLocal: Boolean override fun compute(): CachedValueProvider.Result? { + if (files.isEmpty()) return null return CachedValueProvider.Result.create( computeLightClassData(), if (isLocal) PsiModificationTracker.MODIFICATION_COUNT else PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinClassProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinClassProcessor.kt index 59d914ddd47..612ebd7cb1c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinClassProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinClassProcessor.kt @@ -21,6 +21,7 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiReference import com.intellij.refactoring.JavaRefactoringSettings import com.intellij.refactoring.listeners.RefactoringElementListener +import com.intellij.refactoring.rename.RenamePsiElementProcessor import com.intellij.usageView.UsageInfo import org.jetbrains.kotlin.asJava.KtLightClass import org.jetbrains.kotlin.asJava.KtLightClassForExplicitDeclaration @@ -69,7 +70,9 @@ class RenameKotlinClassProcessor : RenameKotlinPsiProcessor() { if (virtualFile != null) { val nameWithoutExtensions = virtualFile.nameWithoutExtension if (nameWithoutExtensions == classOrObject.name) { - allRenames.put(file, newName + "." + virtualFile.extension) + val newFileName = newName + "." + virtualFile.extension + allRenames.put(file, newFileName) + RenamePsiElementProcessor.forElement(file).prepareRenaming(file, newFileName, allRenames) } } } diff --git a/idea/testData/refactoring/rename/renameKotlinFacadeClassViaTopLevelClass/after/foo/TopLevel2.kt b/idea/testData/refactoring/rename/renameKotlinFacadeClassViaTopLevelClass/after/foo/TopLevel2.kt new file mode 100644 index 00000000000..cc153a87777 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinFacadeClassViaTopLevelClass/after/foo/TopLevel2.kt @@ -0,0 +1,4 @@ +package foo + +class TopLevel2 {} +fun topMe() {} diff --git a/idea/testData/refactoring/rename/renameKotlinFacadeClassViaTopLevelClass/after/foo/TopUser.java b/idea/testData/refactoring/rename/renameKotlinFacadeClassViaTopLevelClass/after/foo/TopUser.java new file mode 100644 index 00000000000..8d358c26661 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinFacadeClassViaTopLevelClass/after/foo/TopUser.java @@ -0,0 +1,7 @@ +package foo; + +public class TopUser { + public void use() { + TopLevel2Kt.topMe(); + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameKotlinFacadeClassViaTopLevelClass/before/foo/TopLevel.kt b/idea/testData/refactoring/rename/renameKotlinFacadeClassViaTopLevelClass/before/foo/TopLevel.kt new file mode 100644 index 00000000000..ed5641cfc6d --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinFacadeClassViaTopLevelClass/before/foo/TopLevel.kt @@ -0,0 +1,4 @@ +package foo + +class /*rename*/TopLevel {} +fun topMe() {} diff --git a/idea/testData/refactoring/rename/renameKotlinFacadeClassViaTopLevelClass/before/foo/TopUser.java b/idea/testData/refactoring/rename/renameKotlinFacadeClassViaTopLevelClass/before/foo/TopUser.java new file mode 100644 index 00000000000..2c9578bed71 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinFacadeClassViaTopLevelClass/before/foo/TopUser.java @@ -0,0 +1,7 @@ +package foo; + +public class TopUser { + public void use() { + TopLevelKt.topMe(); + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameKotlinFacadeClassViaTopLevelClass/renameKotlinFacadeClassViaTopLevelClass.test b/idea/testData/refactoring/rename/renameKotlinFacadeClassViaTopLevelClass/renameKotlinFacadeClassViaTopLevelClass.test new file mode 100644 index 00000000000..414527dff73 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinFacadeClassViaTopLevelClass/renameKotlinFacadeClassViaTopLevelClass.test @@ -0,0 +1,6 @@ +{ + "type": "MARKED_ELEMENT", + "mainFile": "foo/TopLevel.kt", + "newName": "TopLevel2", + "withRuntime": "true" +} \ 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 72eb2688936..3255341a48e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java @@ -515,6 +515,12 @@ public class RenameTestGenerated extends AbstractRenameTest { doTest(fileName); } + @TestMetadata("renameKotlinFacadeClassViaTopLevelClass/renameKotlinFacadeClassViaTopLevelClass.test") + public void testRenameKotlinFacadeClassViaTopLevelClass_RenameKotlinFacadeClassViaTopLevelClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinFacadeClassViaTopLevelClass/renameKotlinFacadeClassViaTopLevelClass.test"); + doTest(fileName); + } + @TestMetadata("renameKotlinFacadeClassWithDefaultNameAndCommentsByRef/renameKotlinFacadeClassWithDefaultNameByRef.test") public void testRenameKotlinFacadeClassWithDefaultNameAndCommentsByRef_RenameKotlinFacadeClassWithDefaultNameByRef() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinFacadeClassWithDefaultNameAndCommentsByRef/renameKotlinFacadeClassWithDefaultNameByRef.test");