override fun getR6ContextInner()

in psi/src/com/intellij/r/psi/classes/r6/context/R6CreateClassContextProvider.kt [46:94]


  override fun getR6ContextInner(element: RPsiElement): R6CreateClassContext? {
    val parentCall = PsiTreeUtil.getParentOfType(element, RCallExpression::class.java) ?: return null
    return if (parentCall.isFunctionFromLibrary(R6ClassInfoUtil.R6CreateClassMethod, R6ClassInfoUtil.R6PackageName)) {
      val parentArgumentInfo = RArgumentInfo.getArgumentInfo(parentCall) ?: return null
      when (element) {
        parentArgumentInfo.getArgumentPassedToParameter(R6ClassInfoUtil.argumentClassName) -> {
          // R6Class("<caret>")
          R6CreateClassNameContext(element, parentCall)
        }

        else -> null
      }
    } else {
      val superParentCall = PsiTreeUtil.getParentOfType(parentCall, RCallExpression::class.java) ?: return null
      if (!superParentCall.isFunctionFromLibrary(R6ClassInfoUtil.R6CreateClassMethod, R6ClassInfoUtil.R6PackageName)) return null
      val superParentArgumentInfo = RArgumentInfo.getArgumentInfo(superParentCall) ?: return null

      return when {
        // R6Class("MyClass", inherit = "<caret>")
        PsiTreeUtil.isAncestor(superParentArgumentInfo.getArgumentPassedToParameter(R6ClassInfoUtil.argumentSuperClass), element,
                               false) -> {
          val parent = element.parent
          if (parent is RNamedArgument && parent.nameIdentifier == element) null
          else R6CreateClassInheritContext(element, superParentCall)
        }

        // R6Class("MyClass", public = "<caret>"
        // R6Class("MyClass", public = list("<caret>")
        // R6Class("MyClass", public = list(smt = "<caret>")

        // R6Class("MyClass", private = "<caret>"
        // R6Class("MyClass", private = list("<caret>")
        // R6Class("MyClass", private = list(smt = "<caret>")

        // R6Class("MyClass", active = "<caret>"
        // R6Class("MyClass", active = list("<caret>")
        // R6Class("MyClass", active = list(smt = "<caret>")
        PsiTreeUtil.isAncestor(superParentArgumentInfo.getArgumentPassedToParameter(R6ClassInfoUtil.argumentPublic), element, false) ||
        PsiTreeUtil.isAncestor(superParentArgumentInfo.getArgumentPassedToParameter(R6ClassInfoUtil.argumentPrivate), element, false) ||
        PsiTreeUtil.isAncestor(superParentArgumentInfo.getArgumentPassedToParameter(R6ClassInfoUtil.argumentActive), element, false) -> {
          val parent = element.parent
          if (parent !is RNamedArgument || parent.assignedValue != element) null
          else R6CreateClassMembersContext(element, superParentCall)
        }

        else -> null
      }
    }
  }