From c16000947738cacd5b8e2f2fc0fd9381a9609da4 Mon Sep 17 00:00:00 2001 From: Bart van Helvert Date: Fri, 2 Aug 2024 12:01:24 +0200 Subject: [PATCH] [kotlin] Find internal usages for KDoc references #KTIJ-30858 Fixed GitOrigin-RevId: 06936e333d9bb60fbf5156213d8873a503550e8e --- .../refactoring/move/MoveTestGenerated.java | 5 ++++ .../moveDetachedComment/after/a/Other.kt | 3 +++ .../moveDetachedComment/after/b/main.kt | 10 +++++++ .../moveDetachedComment/before/a/Other.kt | 3 +++ .../moveDetachedComment/before/a/main.kt | 10 +++++++ .../moveDetachedComment.test | 8 ++++++ .../move/processor/K2MoveRenameUsageInfo.kt | 27 ++++++++++++------- .../K2MoveFileOrDirectoriesTestGenerated.java | 5 ++++ 8 files changed, 61 insertions(+), 10 deletions(-) create mode 100644 plugins/kotlin/idea/tests/testData/refactoring/moveFile/kotlin/moveDetachedComment/after/a/Other.kt create mode 100644 plugins/kotlin/idea/tests/testData/refactoring/moveFile/kotlin/moveDetachedComment/after/b/main.kt create mode 100644 plugins/kotlin/idea/tests/testData/refactoring/moveFile/kotlin/moveDetachedComment/before/a/Other.kt create mode 100644 plugins/kotlin/idea/tests/testData/refactoring/moveFile/kotlin/moveDetachedComment/before/a/main.kt create mode 100644 plugins/kotlin/idea/tests/testData/refactoring/moveFile/kotlin/moveDetachedComment/moveDetachedComment.test diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/refactoring/move/MoveTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/refactoring/move/MoveTestGenerated.java index 22d5dcad546f..4f4b6040aef5 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/refactoring/move/MoveTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/refactoring/move/MoveTestGenerated.java @@ -179,6 +179,11 @@ public abstract class MoveTestGenerated extends AbstractMoveTest { runTest("testData/refactoring/moveFile/kotlin/moveClassWithExtensionFunction/moveClassWithExtensionFunction.test"); } + @TestMetadata("kotlin/moveDetachedComment/moveDetachedComment.test") + public void testKotlin_moveDetachedComment_MoveDetachedComment() throws Exception { + runTest("testData/refactoring/moveFile/kotlin/moveDetachedComment/moveDetachedComment.test"); + } + @TestMetadata("kotlin/moveFileAndDirWithJavaFileReferringToPackageFragementWithUnmatchedDir/moveFileAndDirWithJavaFileReferringToPackageFragementWithUnmatchedDir.test") public void testKotlin_moveFileAndDirWithJavaFileReferringToPackageFragementWithUnmatchedDir_MoveFileAndDirWithJavaFileReferringToPackageFragementWithUnmatchedDir() throws Exception { runTest("testData/refactoring/moveFile/kotlin/moveFileAndDirWithJavaFileReferringToPackageFragementWithUnmatchedDir/moveFileAndDirWithJavaFileReferringToPackageFragementWithUnmatchedDir.test"); diff --git a/plugins/kotlin/idea/tests/testData/refactoring/moveFile/kotlin/moveDetachedComment/after/a/Other.kt b/plugins/kotlin/idea/tests/testData/refactoring/moveFile/kotlin/moveDetachedComment/after/a/Other.kt new file mode 100644 index 000000000000..0424867f60c4 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/refactoring/moveFile/kotlin/moveDetachedComment/after/a/Other.kt @@ -0,0 +1,3 @@ +package a + +class Other { } \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/moveFile/kotlin/moveDetachedComment/after/b/main.kt b/plugins/kotlin/idea/tests/testData/refactoring/moveFile/kotlin/moveDetachedComment/after/b/main.kt new file mode 100644 index 000000000000..85bbdce8d83e --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/refactoring/moveFile/kotlin/moveDetachedComment/after/b/main.kt @@ -0,0 +1,10 @@ +package b + +/** + * [a.Other] + */ + +/** + * + */ +class Test { } \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/moveFile/kotlin/moveDetachedComment/before/a/Other.kt b/plugins/kotlin/idea/tests/testData/refactoring/moveFile/kotlin/moveDetachedComment/before/a/Other.kt new file mode 100644 index 000000000000..0424867f60c4 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/refactoring/moveFile/kotlin/moveDetachedComment/before/a/Other.kt @@ -0,0 +1,3 @@ +package a + +class Other { } \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/moveFile/kotlin/moveDetachedComment/before/a/main.kt b/plugins/kotlin/idea/tests/testData/refactoring/moveFile/kotlin/moveDetachedComment/before/a/main.kt new file mode 100644 index 000000000000..3521a75a1c6d --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/refactoring/moveFile/kotlin/moveDetachedComment/before/a/main.kt @@ -0,0 +1,10 @@ +package a + +/** + * [Other] + */ + +/** + * + */ +class Test { } \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/moveFile/kotlin/moveDetachedComment/moveDetachedComment.test b/plugins/kotlin/idea/tests/testData/refactoring/moveFile/kotlin/moveDetachedComment/moveDetachedComment.test new file mode 100644 index 000000000000..6de6e06fe34d --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/refactoring/moveFile/kotlin/moveDetachedComment/moveDetachedComment.test @@ -0,0 +1,8 @@ +{ + "mainFile": "a/main.kt", + "type": "MOVE_FILES", + "targetPackage": "b", + "withRuntime": "true", + "enabledInK1": "false", + "enabledInK2": "true" +} diff --git a/plugins/kotlin/refactorings/kotlin.refactorings.move.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/move/processor/K2MoveRenameUsageInfo.kt b/plugins/kotlin/refactorings/kotlin.refactorings.move.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/move/processor/K2MoveRenameUsageInfo.kt index 3c5364e338b7..23d1aedcf9a4 100644 --- a/plugins/kotlin/refactorings/kotlin.refactorings.move.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/move/processor/K2MoveRenameUsageInfo.kt +++ b/plugins/kotlin/refactorings/kotlin.refactorings.move.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/move/processor/K2MoveRenameUsageInfo.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.idea.references.KtConstructorDelegationReference import org.jetbrains.kotlin.idea.references.KtReference import org.jetbrains.kotlin.idea.references.KtSimpleNameReference import org.jetbrains.kotlin.idea.references.mainReference +import org.jetbrains.kotlin.kdoc.psi.impl.KDocName import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType @@ -228,13 +229,18 @@ sealed class K2MoveRenameUsageInfo( * @see restoreInternalUsages * @see K2MoveRenameUsageInfo.Source.refresh */ - internal var KtReferenceExpression.internalUsageInfo: K2MoveRenameUsageInfo? by CopyablePsiUserDataProperty(Key.create("INTERNAL_USAGE_INFO")) + internal var KtElement.internalUsageInfo: K2MoveRenameUsageInfo? by CopyablePsiUserDataProperty(Key.create("INTERNAL_USAGE_INFO")) /** * Finds any usage inside [containing]. We need these usages because when moving [containing] to a different package references * that where previously imported by default might now require an explicit import. */ fun markInternalUsages(containing: KtElement) { + containing.forEachDescendantOfType { name -> + val reference = name.mainReference + val resolved = reference.resolve() as? PsiNamedElement ?: return@forEachDescendantOfType + name.internalUsageInfo = Source(name, reference, resolved, true) + } containing.forEachDescendantOfType { refExpr -> if (refExpr is KtEnumEntrySuperclassReferenceExpression) return@forEachDescendantOfType if (refExpr.parent is KtSuperExpression || refExpr.parent is KtThisExpression) return@forEachDescendantOfType @@ -310,18 +316,19 @@ sealed class K2MoveRenameUsageInfo( * @see internalUsageInfo */ private fun restoreInternalUsages( - containingElement: KtElement, + containingElem: KtElement, oldToNewMap: Map, fromCopy: Boolean ): List { - return containingElement.collectDescendantsOfType().mapNotNull { refExpr -> - val usageInfo = refExpr.internalUsageInfo - if (!fromCopy && usageInfo?.element != null) return@mapNotNull usageInfo - val referencedElement = (usageInfo as? Source)?.referencedElement ?: return@mapNotNull null - val newReferencedElement = oldToNewMap[referencedElement] ?: referencedElement - if (!newReferencedElement.isValid || newReferencedElement !is PsiNamedElement) return@mapNotNull null - usageInfo.refresh(refExpr, newReferencedElement) - } + return (containingElem.collectDescendantsOfType() + containingElem.collectDescendantsOfType()) + .mapNotNull { refExpr -> + val usageInfo = refExpr.internalUsageInfo + if (!fromCopy && usageInfo?.element != null) return@mapNotNull usageInfo + val referencedElement = (usageInfo as? Source)?.referencedElement ?: return@mapNotNull null + val newReferencedElement = oldToNewMap[referencedElement] ?: referencedElement + if (!newReferencedElement.isValid || newReferencedElement !is PsiNamedElement) return@mapNotNull null + usageInfo.refresh(refExpr, newReferencedElement) + } } /** diff --git a/plugins/kotlin/refactorings/kotlin.refactorings.move.k2/test/org/jetbrains/kotlin/idea/k2/refactoring/move/K2MoveFileOrDirectoriesTestGenerated.java b/plugins/kotlin/refactorings/kotlin.refactorings.move.k2/test/org/jetbrains/kotlin/idea/k2/refactoring/move/K2MoveFileOrDirectoriesTestGenerated.java index 8230f36707a2..371744d7e3f9 100644 --- a/plugins/kotlin/refactorings/kotlin.refactorings.move.k2/test/org/jetbrains/kotlin/idea/k2/refactoring/move/K2MoveFileOrDirectoriesTestGenerated.java +++ b/plugins/kotlin/refactorings/kotlin.refactorings.move.k2/test/org/jetbrains/kotlin/idea/k2/refactoring/move/K2MoveFileOrDirectoriesTestGenerated.java @@ -75,6 +75,11 @@ public class K2MoveFileOrDirectoriesTestGenerated extends AbstractK2MoveFileOrDi runTest("../../idea/tests/testData/refactoring/moveFile/kotlin/moveClassWithExtensionFunction/moveClassWithExtensionFunction.test"); } + @TestMetadata("kotlin/moveDetachedComment/moveDetachedComment.test") + public void testKotlin_moveDetachedComment_MoveDetachedComment() throws Exception { + runTest("../../idea/tests/testData/refactoring/moveFile/kotlin/moveDetachedComment/moveDetachedComment.test"); + } + @TestMetadata("kotlin/moveFileAndDirWithJavaFileReferringToPackageFragementWithUnmatchedDir/moveFileAndDirWithJavaFileReferringToPackageFragementWithUnmatchedDir.test") public void testKotlin_moveFileAndDirWithJavaFileReferringToPackageFragementWithUnmatchedDir_MoveFileAndDirWithJavaFileReferringToPackageFragementWithUnmatchedDir() throws Exception { runTest("../../idea/tests/testData/refactoring/moveFile/kotlin/moveFileAndDirWithJavaFileReferringToPackageFragementWithUnmatchedDir/moveFileAndDirWithJavaFileReferringToPackageFragementWithUnmatchedDir.test");