cfleming
04/21/2017, 12:17 AMclass 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)
}
}