override fun findUsages()

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
    }