override fun getS4ContextWithoutCaching()

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
      }
    }
  }