in src/main/kotlin/org/arend/refactoring/move/ArendMoveRefactoringProcessor.kt [72:120]
override fun findUsages(): Array<UsageInfo> {
val usagesList = ArrayList<UsageInfo>()
val statCmdsToFix = HashMap<ArendStatCmd, PsiReference>()
val containers = HashSet<ArendGroup>()
val containerUsages = MultiMap<ArendGroup, ArendGroup>()
myReferableDescriptors.clear()
myMovedReferables.clear()
for (psiReference in ReferencesSearch.search(mySourceContainer)) {
val statCmd = isStatCmdUsage(psiReference, true)
if (statCmd is ArendStatCmd && psiReference.element.findNextSibling(DOT) !is ArendReferenceElement &&
myMembers.any { getImportedNames(statCmd, it.name).isNotEmpty() }) {
statCmdsToFix[statCmd] = psiReference
statCmd.ancestor<ArendGroup>()?.let{ containers.add(it) }
}
}
for ((index, member) in myMembers.withIndex())
for ((psi, descriptor) in collectInternalReferablesWithSelf(member, index)) {
myReferableDescriptors[psi] = descriptor
for (psiReference in ReferencesSearch.search(psi)) {
val referenceElement = psiReference.element
val referenceParent = referenceElement.parent
val cmdContainer = referenceElement.ancestors.filterIsInstance<ArendGroup>().toList().reversed().firstOrNull { containers.contains(it) }
if (cmdContainer != null) containerUsages.putValue(cmdContainer, member)
if (!isInMovedMember(psiReference.element)) {
val statCmd = isStatCmdUsage(psiReference, false)
val isUsageInHiding = referenceElement is ArendRefIdentifier && referenceParent is ArendStatCmd
if (statCmd == null || isUsageInHiding || !statCmdsToFix.contains(statCmd))
usagesList.add(ArendUsageLocationInfo(psiReference, descriptor))
}
}
}
for (statCmd in statCmdsToFix) {
val statCmdContainer = statCmd.key.ancestor<ArendGroup>()
val usedMembers = statCmdContainer?.let { containerUsages.get(it) }
if ((usedMembers?.size ?: 0) > 0) {
usagesList.add(ArendStatCmdUsageInfo(statCmd.key, statCmd.value))
}
}
var usageInfos = usagesList.toTypedArray()
usageInfos = UsageViewUtil.removeDuplicatedUsages(usageInfos)
return usageInfos
}