``` class ClojureApiKotlinPsiReferenceContributor ...
# intellij-plugins
c
Copy code
class ClojureApiKotlinPsiReferenceContributor : ApiReferenceContributor() {
  override fun provider() =
      object : PsiReferenceProvider() {
        override fun getReferencesByElement(element: PsiElement, context: ProcessingContext): Array<out PsiReference> {
          if (!isStringLiteral(element)) return PsiReference.EMPTY_ARRAY

          val call = ((element.parent as? KtValueArgument)
              ?.parent as? KtValueArgumentList)
                         ?.parent as? KtCallExpression ?: return PsiReference.EMPTY_ARRAY

          val bindingContext = (element as KtElement).analyze(BodyResolveMode.PARTIAL)

          val resolvedCall = call.getResolvedCall(bindingContext) ?: return PsiReference.EMPTY_ARRAY
          if (!resolvedCall.isReallySuccess()) return PsiReference.EMPTY_ARRAY
          val methodFqn = resolvedCall.resultingDescriptor.fqNameUnsafe.asString()

          val arguments = resolvedCall.call.valueArguments
          val expressions = arguments.map { it.getArgumentExpression()!! }.toTypedArray()
          val argCount = arguments.size

          return references(element, methodFqn, expressions, argCount)
        }
      }