in src/main/kotlin/org/arend/refactoring/changeSignature/entries/UsageEntry.kt [269:314]
fun getContextName(context: ChangeSignatureRefactoringContext, concreteExpr: Concrete.SourceNode): String {
val referenceExpression = when (concreteExpr) {
is Concrete.AppExpression -> concreteExpr.function.data
is Concrete.ReferenceExpression -> concreteExpr.data
is Concrete.ConstructorPattern -> concreteExpr.constructorData
else -> null
}
val referent = when (concreteExpr) {
is Concrete.ReferenceExpression -> concreteExpr.referent
is Concrete.AppExpression -> (concreteExpr.function as? Concrete.ReferenceExpression)?.referent
is Concrete.ConstructorPattern -> concreteExpr.constructor
else -> null
}
val referenceList: List<ArendReference> = when (referenceExpression) {
is ArendLongName -> referenceExpression.refIdentifierList.map { it.reference }
is ArendPattern -> referenceExpression.childOfType<ArendLongName>()?.refIdentifierList?.map { it.reference } ?:
(referenceExpression.singleReferable?.reference?.let { singletonList(it) }) ?: emptyList()
is ArendIPName -> (referenceExpression.parentLongName?.refIdentifierList?.map { it.reference } ?: emptyList()) +
singletonList(referenceExpression.reference)
else -> emptyList()
}
val longName: List<String> = when (referenceExpression) {
is ArendLongName -> referenceExpression.longName
is ArendPattern -> referenceList.map { it.element.text }
is ArendIPName -> referenceExpression.longName
else -> emptyList()
}
var resolvesOk = true
for (i in 0..referenceList.size - 2) {
val ref1 = referenceList[i].resolve() as? ArendGroup
val ref2 = referenceList[i+1].resolve() as? PsiLocatedReferable
if (ref1 == null || ref2 == null || !(ref1.dynamicSubgroups.contains(ref2) || ref1.internalReferables.contains(ref2) || ref1.statements.any { it.group == ref2 })) {
resolvesOk = false
}
}
if (!resolvesOk && referent is PsiLocatedReferable && referenceExpression is ArendCompositeElement) {
return getContextName(referent, referenceExpression, context)
}
return getCorrectedContextName(context, referenceList.zip(longName))
}