[kotlin] Moved K2 UsageInfo to its own package

KTIJ-28862

GitOrigin-RevId: 0d6cb988c934a16b244481b5af6af396d4ecaf98
This commit is contained in:
Frederik Haselmeier
2024-11-26 11:10:16 +00:00
committed by intellij-monorepo-bot
parent 62ebbe5db8
commit d77e86c64a
10 changed files with 72 additions and 62 deletions
@@ -31,10 +31,10 @@ import org.jetbrains.kotlin.idea.core.getFqNameWithImplicitPrefixOrRoot
import org.jetbrains.kotlin.idea.core.packageMatchesDirectoryOrImplicit
import org.jetbrains.kotlin.idea.k2.refactoring.move.descriptor.K2MoveTargetDescriptor
import org.jetbrains.kotlin.idea.k2.refactoring.move.descriptor.K2MoveTargetDescriptor.Directory
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.K2MoveRenameUsageInfo.Companion.markInternalUsages
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.K2MoveRenameUsageInfo.Companion.retargetInternalUsagesForCopyFile
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.K2MoveRenameUsageInfo.Companion.retargetUsages
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.K2MoveRenameUsageInfo.Companion.unMarkAllUsages
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.usages.K2MoveRenameUsageInfo.Companion.markInternalUsages
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.usages.K2MoveRenameUsageInfo.Companion.retargetInternalUsagesForCopyFile
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.usages.K2MoveRenameUsageInfo.Companion.retargetUsages
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.usages.K2MoveRenameUsageInfo.Companion.unMarkAllUsages
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.conflict.checkModuleDependencyConflictsForInternalUsages
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.conflict.checkVisibilityConflictsForInternalUsages
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.createKotlinFile
@@ -14,6 +14,7 @@ import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectori
import com.intellij.usageView.UsageInfo
import com.intellij.util.Function
import com.intellij.util.containers.MultiMap
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.usages.K2MoveRenameUsageInfo
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtFile
@@ -18,6 +18,8 @@ import org.jetbrains.kotlin.idea.k2.refactoring.move.descriptor.K2MoveDescriptor
import org.jetbrains.kotlin.idea.k2.refactoring.move.descriptor.K2MoveOperationDescriptor
import org.jetbrains.kotlin.idea.k2.refactoring.move.descriptor.K2MoveSourceDescriptor
import org.jetbrains.kotlin.idea.k2.refactoring.move.descriptor.K2MoveTargetDescriptor
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.usages.ImplicitCompanionAsDispatchReceiverUsageInfo
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.usages.OuterInstanceReferenceUsageInfo
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
@@ -11,8 +11,8 @@ import com.intellij.refactoring.util.RefactoringUIUtil
import com.intellij.util.containers.MultiMap
import com.intellij.util.containers.toMultiMap
import org.jetbrains.kotlin.idea.base.util.module
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.K2MoveRenameUsageInfo.Companion.internalUsageElements
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.K2MoveRenameUsageInfo.Companion.internalUsageInfo
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.usages.K2MoveRenameUsageInfo.Companion.internalUsageElements
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.usages.K2MoveRenameUsageInfo.Companion.internalUsageInfo
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.isInternal
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.tryFindConflict
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.willBeMoved
@@ -21,8 +21,8 @@ import org.jetbrains.kotlin.asJava.toLightElements
import org.jetbrains.kotlin.idea.base.resources.KotlinBundle
import org.jetbrains.kotlin.idea.base.util.module
import org.jetbrains.kotlin.idea.core.getFqNameByDirectory
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.K2MoveRenameUsageInfo.Companion.internalUsageElements
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.K2MoveRenameUsageInfo.Companion.internalUsageInfo
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.usages.K2MoveRenameUsageInfo.Companion.internalUsageElements
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.usages.K2MoveRenameUsageInfo.Companion.internalUsageInfo
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.tryFindConflict
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.willBeMoved
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.willNotBeMoved
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.idea.base.resources.KotlinBundle
import org.jetbrains.kotlin.idea.base.util.module
import org.jetbrains.kotlin.idea.codeinsight.utils.toVisibility
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.conflict.*
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.usages.K2MoveRenameUsageInfo
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtFile
@@ -22,7 +22,9 @@ import org.jetbrains.kotlin.analysis.api.symbols.KaSymbol
import org.jetbrains.kotlin.analysis.api.types.symbol
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
import org.jetbrains.kotlin.idea.base.util.quoteIfNeeded
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.K2MoveRenameUsageInfo.Companion.markInternalUsages
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.usages.K2MoveRenameUsageInfo
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.usages.K2MoveRenameUsageInfo.Companion.markInternalUsages
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.usages.OuterInstanceReferenceUsageInfo
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
@@ -1,11 +1,11 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.idea.k2.refactoring.move.processor
package org.jetbrains.kotlin.idea.k2.refactoring.move.processor.usages
import com.intellij.usageView.UsageInfo
import org.jetbrains.kotlin.psi.KtObjectDeclaration
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
class ImplicitCompanionAsDispatchReceiverUsageInfo(
callee: KtSimpleNameExpression,
val companionObject: KtObjectDeclaration
) : UsageInfo(callee)
callee: KtSimpleNameExpression,
val companionObject: KtObjectDeclaration
) : UsageInfo(callee)
@@ -1,5 +1,5 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.idea.k2.refactoring.move.processor
package org.jetbrains.kotlin.idea.k2.refactoring.move.processor.usages
import com.intellij.openapi.progress.ProgressManager
import com.intellij.openapi.util.Key
@@ -25,9 +25,11 @@ import org.jetbrains.kotlin.idea.base.analysis.canAddRootPrefix
import org.jetbrains.kotlin.idea.base.resources.KotlinBundle
import org.jetbrains.kotlin.idea.base.util.projectScope
import org.jetbrains.kotlin.idea.codeinsight.utils.getLeftMostReceiverExpression
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.K2MoveRenameUsageInfo.Companion.addRootPrefix
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.K2MoveRenameUsageInfo.Companion.restoreInternalUsages
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.K2MoveRenameUsageInfo.Companion.updatableUsageInfo
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.groupByFile
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.sortedByOffset
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.usages.K2MoveRenameUsageInfo.Companion.addRootPrefix
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.usages.K2MoveRenameUsageInfo.Companion.restoreInternalUsages
import org.jetbrains.kotlin.idea.k2.refactoring.move.processor.usages.K2MoveRenameUsageInfo.Companion.updatableUsageInfo
import org.jetbrains.kotlin.idea.references.*
import org.jetbrains.kotlin.kdoc.psi.impl.KDocName
import org.jetbrains.kotlin.psi.*
@@ -39,9 +41,9 @@ import org.jetbrains.kotlin.resolve.ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE
* Moving, for example, an instance method can result in the method losing visibility to a usage, but just this method doesn't need updating.
*/
sealed class K2MoveRenameUsageInfo(
element: PsiElement,
reference: PsiReference,
referencedElement: PsiNamedElement
element: PsiElement,
reference: PsiReference,
referencedElement: PsiNamedElement
) : MoveRenameUsageInfo(element, reference, referencedElement) {
abstract fun retarget(to: PsiNamedElement): PsiElement?
@@ -49,12 +51,12 @@ sealed class K2MoveRenameUsageInfo(
* A usage described in a foreign language like Java or Groovy.
*/
class Light(
element: PsiElement,
reference: PsiReference,
referencedElement: KtNamedDeclaration,
private val wasMember: Boolean,
private val oldContainingFqn: String?,
private val lightElementIndex: Int,
element: PsiElement,
reference: PsiReference,
referencedElement: KtNamedDeclaration,
private val wasMember: Boolean,
private val oldContainingFqn: String?,
private val lightElementIndex: Int,
) : K2MoveRenameUsageInfo(element, reference, referencedElement) {
override fun retarget(to: PsiNamedElement): PsiElement? {
if (to !is KtNamedDeclaration) error("Usage must reference a Kotlin element")
@@ -69,9 +71,9 @@ sealed class K2MoveRenameUsageInfo(
}
private fun updateJavaReference(
reference: PsiReferenceExpression,
oldClassFqn: String?,
newElement: PsiMember
reference: PsiReferenceExpression,
oldClassFqn: String?,
newElement: PsiMember
): Boolean {
// TODO do proper implementation here where it keeps the import as-is
val importOfOldClass = (reference.containingFile as? PsiJavaFile)?.importList?.allImportStatements?.firstOrNull {
@@ -113,10 +115,10 @@ sealed class K2MoveRenameUsageInfo(
* moved in this move operation.
*/
class Source(
element: KtElement,
reference: KtReference,
referencedElement: PsiNamedElement,
val isInternal: Boolean
element: KtElement,
reference: KtReference,
referencedElement: PsiNamedElement,
val isInternal: Boolean
) : K2MoveRenameUsageInfo(element, reference, referencedElement) {
fun refresh(element: KtElement, referencedElement: PsiNamedElement): K2MoveRenameUsageInfo {
val reference = element.mainReference ?: return this
@@ -170,16 +172,18 @@ sealed class K2MoveRenameUsageInfo(
/**
* Internal usage info that can be retargeted.
*/
internal var KtElement.updatableUsageInfo: K2MoveRenameUsageInfo? by CopyablePsiUserDataProperty(Key.create("UPDATABLE_INTERNAL_USAGE_INFO"))
internal var KtElement.updatableUsageInfo: K2MoveRenameUsageInfo? by CopyablePsiUserDataProperty(
Key.create("UPDATABLE_INTERNAL_USAGE_INFO"))
/**
* Internal usage info that can't be retargeted but might still be useful in, for example, conflict checking.
*/
internal var KtElement.nonUpdatableUsageInfo: K2MoveRenameUsageInfo? by CopyablePsiUserDataProperty(Key.create("NON_UPDATABLE_INTERNAL_USAGE_INFO"))
internal var KtElement.nonUpdatableUsageInfo: K2MoveRenameUsageInfo? by CopyablePsiUserDataProperty(
Key.create("NON_UPDATABLE_INTERNAL_USAGE_INFO"))
fun PsiElement.internalUsageElements() = collectDescendantsOfType<KDocName>() +
collectDescendantsOfType<KtReferenceExpression>() +
collectDescendantsOfType<KtForExpression>()
collectDescendantsOfType<KtReferenceExpression>() +
collectDescendantsOfType<KtForExpression>()
/**
* Finds any usage inside [containing].
@@ -206,9 +210,9 @@ sealed class K2MoveRenameUsageInfo(
val mainReference = refElem.mainReference
if (mainReference != null) {
val declPsi = analyze(refElem) {
mainReference.resolveToSymbols().firstOrNull { declSymbol ->
(declSymbol as KaCallableSymbol).isExtensionDecl()
}?.psi
mainReference.resolveToSymbols().firstOrNull { declSymbol ->
(declSymbol as KaCallableSymbol).isExtensionDecl()
}?.psi
}
if (declPsi is PsiNamedElement) {
refElem.updatableUsageInfo = Source(refElem, mainReference, declPsi, true)
@@ -232,10 +236,10 @@ sealed class K2MoveRenameUsageInfo(
if (mainReference is KtConstructorDelegationReference) return
val resolved = mainReference.resolve() as? PsiNamedElement ?: return
val isExtensionReference = if (resolved is KtCallableDeclaration) {
analyze(resolved) {
val symbol = resolved.symbol
if (symbol is KaCallableSymbol) symbol.isExtensionDecl() else false
}
analyze(resolved) {
val symbol = resolved.symbol
if (symbol is KaCallableSymbol) symbol.isExtensionDecl() else false
}
} else false
if (resolved is KtParameter) return
if (resolved is KtNamedDeclaration && resolved.isDeclaredInContainingContext(expr, topLevelMoved)) return
@@ -280,7 +284,7 @@ sealed class K2MoveRenameUsageInfo(
private fun KtReferenceExpression.getQualifiedChainElement(): KtElement {
return generateSequence<KtElement>(this) {
it.parent as? KtQualifiedExpression ?: it.parent as? KtCallExpression ?: it.parent as? KtUserType
it.parent as? KtQualifiedExpression ?: it.parent as? KtCallExpression ?: it.parent as? KtUserType
}.last()
}
@@ -296,9 +300,9 @@ sealed class K2MoveRenameUsageInfo(
* @see updatableUsageInfo
*/
private fun restoreInternalUsages(
containing: KtElement,
oldToNewMap: Map<PsiElement, PsiElement>,
fromCopy: Boolean
containing: KtElement,
oldToNewMap: Map<PsiElement, PsiElement>,
fromCopy: Boolean
): List<UsageInfo> {
return containing.internalUsageElements().mapNotNull { refExpr ->
val usageInfo = refExpr.updatableUsageInfo
@@ -345,8 +349,8 @@ sealed class K2MoveRenameUsageInfo(
}
fun restoreInternalUsagesSorted(
oldToNewMap: Map<PsiElement, PsiElement>,
fromCopy: Boolean = false
oldToNewMap: Map<PsiElement, PsiElement>,
fromCopy: Boolean = false
): Map<PsiFile, List<K2MoveRenameUsageInfo>> {
val newElements = oldToNewMap.values.toList()
val topLevelElements = newElements
@@ -411,9 +415,9 @@ sealed class K2MoveRenameUsageInfo(
}
private fun retargetMoveUsages(
usageInfosByFile: Map<PsiFile, List<K2MoveRenameUsageInfo>>,
oldToNewMap: Map<PsiElement, PsiElement>,
totalFileCount: Int
usageInfosByFile: Map<PsiFile, List<K2MoveRenameUsageInfo>>,
oldToNewMap: Map<PsiElement, PsiElement>,
totalFileCount: Int
): Map<PsiFile, Map<PsiElement, PsiNamedElement>> {
val progress = ProgressManager.getInstance().progressIndicator
return usageInfosByFile.map { (file, usageInfos) ->
@@ -425,7 +429,7 @@ sealed class K2MoveRenameUsageInfo(
val qualifiedReference = if (retargetedReference is KtSimpleNameExpression) {
// get top most qualified for shortening if we don't have it already
generateSequence<KtElement>(retargetedReference) {
it.parent as? KtQualifiedExpression ?: it.parent as? KtCallExpression ?: it.parent as? KtUserType
it.parent as? KtQualifiedExpression ?: it.parent as? KtCallExpression ?: it.parent as? KtUserType
}.last()
} else retargetedReference
if (usageInfo is Source && qualifiedReference != null) {
@@ -438,7 +442,7 @@ sealed class K2MoveRenameUsageInfo(
}
/**
* Adds the [ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE] qualifier prefix to this dot qualified expression if it is not there already.
* Adds the [org.jetbrains.kotlin.resolve.ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE] qualifier prefix to this dot qualified expression if it is not there already.
* This prefix ensures that when we qualify an expression, we do not accidentally capture local variable names that have
* the same name as the package prefix we are located in.
*
@@ -476,7 +480,7 @@ sealed class K2MoveRenameUsageInfo(
// We create pointers to the qualified elements here because they might get invalidated by shortening.
val qualifiedExpressionPointers = usageMap.keys.filterIsInstance<KtDotQualifiedExpression>().map { it.createSmartPointer() }
if (file is KtFile) {
shortenReferences(usageMap.keys.filterIsInstance<KtElement>())
shortenReferences(usageMap.keys.filterIsInstance<KtElement>())
}
// There are some circumstances where the reference shortener does not shorten an expression we added the root prefix to.
// This can happen if the reference shortener is unable to add an import because the declaration's name is already
@@ -1,5 +1,5 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.idea.k2.refactoring.move.processor
package org.jetbrains.kotlin.idea.k2.refactoring.move.processor.usages
import com.intellij.psi.PsiElement
import com.intellij.usageView.UsageInfo
@@ -21,16 +21,16 @@ internal sealed class OuterInstanceReferenceUsageInfo(element: PsiElement, priva
}
class ExplicitThis(
expression: KtThisExpression,
isIndirectOuter: Boolean
expression: KtThisExpression,
isIndirectOuter: Boolean
) : OuterInstanceReferenceUsageInfo(expression, isIndirectOuter) {
val expression: KtThisExpression get() = element as KtThisExpression
}
class ImplicitReceiver(
callElement: KtElement,
isIndirectOuter: Boolean,
private val isDoubleReceiver: Boolean
callElement: KtElement,
isIndirectOuter: Boolean,
private val isDoubleReceiver: Boolean
) : OuterInstanceReferenceUsageInfo(callElement, isIndirectOuter) {
val callElement: KtElement get() = element as KtElement