in psi/src/com/intellij/r/psi/classes/s4/context/setClass/RS4SlotDeclarationContext.kt [29:67]
override fun getS4ContextWithoutCaching(_element: RPsiElement): RS4SlotDeclarationContext? {
val element =
if (_element is RIdentifierExpression) _element.parent
else _element
if (element !is RStringLiteralExpression && element !is RNamedArgument) return null
val parentCall = PsiTreeUtil.getParentOfType(element, RCallExpression::class.java) ?: return null
return if (parentCall.isFunctionFromLibrarySoft("setClass", "methods")) {
if (element !is RStringLiteralExpression) return null
val parentArgumentInfo = RArgumentInfo.getArgumentInfo(parentCall) ?: return null
val className = RS4ClassInfoUtil.getAssociatedClassName(parentCall, parentArgumentInfo) ?: return null
when (element) {
parentArgumentInfo.getArgumentPassedToParameter("slots") -> {
val slot = element.toSlot(className) ?: return null
RS4SlotDeclarationContext(element, parentCall, slot)
}
else -> null
}
}
else {
val superParentCall = PsiTreeUtil.getParentOfType(parentCall, RCallExpression::class.java) ?: return null
if (!superParentCall.isFunctionFromLibrarySoft("setClass", "methods")) return null
val superParentArgumentInfo = RArgumentInfo.getArgumentInfo(superParentCall) ?: return null
val className = RS4ClassInfoUtil.getAssociatedClassName(superParentCall, superParentArgumentInfo) ?: return null
return when {
PsiTreeUtil.isAncestor(superParentArgumentInfo.getArgumentPassedToParameter("slots"), element, false) -> {
val slots = when (element) {
is RStringLiteralExpression -> element.toSlot(className)?.let { listOf(it) } ?: return null
is RNamedArgument -> element.toComplexSlots(className)
else -> return null
}
RS4SlotDeclarationContext(element as RPsiElement, superParentCall, slots)
}
else -> null
}
}
}