override fun isReferenceTo()

in psi/src/com/intellij/r/psi/psi/references/RReferenceBase.kt [35:89]


  override fun isReferenceTo(element: PsiElement): Boolean {
    if (element is PomTargetPsiElement &&
        element.target is RStringLiteralPomTarget &&
        psiElement is RStringLiteralExpression &&
        RS4ContextProvider.getS4Context((element.target as RStringLiteralPomTarget).literal, RS4SetGenericFunctionNameContext::class) != null &&
        RS4ContextProvider.getS4Context(psiElement, RS4SetMethodFunctionNameContext::class) != null
      ) {
      return true
    }
    return when (val resolve = resolve()) {
      is PomTargetPsiElement -> {
        if (element !is RPsiElement) return false
        if (resolve.isEquivalentTo(element)) return true
        val target = resolve.target
        if (target is RStringLiteralPomTarget && element is PomTargetPsiElement) {
          val elementTarget = element.target
          if (elementTarget is RStringLiteralPomTarget &&
              RS4ContextProvider.getS4Context(elementTarget.literal, RS4SetGenericFunctionNameContext::class) != null) {
            val context = RS4ContextProvider.getS4Context(target.literal, RS4SetMethodFunctionNameContext::class)
            if (context != null && target.literal.name == elementTarget.literal.name) return true
          }
        }
        return when {
          target is RS4ComplexSlotPomTarget -> {
            val defIdentifier =
              if (target.slotDefinition is RNamedArgument) target.slotDefinition.nameIdentifier
              else target.slotDefinition
            element === defIdentifier
          }
          element.containingFile?.virtualFile != null &&
          RSourceFileManager.isTemporary(element.containingFile.virtualFile) -> {
            target is RSkeletonParameterPomTarget &&
            element is RIdentifierExpression &&
            element.parent is RParameter &&
            element.name == target.name
          }
          RS4SourceManager.isS4ClassSourceElement(element) -> {
            when (target) {
              is RSkeletonS4SlotPomTarget -> {
                return RPsiUtil.getNamedArgumentByNameIdentifier(element) != null
              }
              is RSkeletonS4ClassPomTarget -> {
                val className = (element.containingFile.firstChild as RCallExpression).argumentList.expressionList.first()
                return element == className
              }
              else -> false
            }
          }
          else -> false
        }
      }
      is PsiNameIdentifierOwner -> resolve === element || resolve.identifyingElement === element
      else -> resolve === element
    }
  }