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