1 package org.jetbrains.dokka 2 3 import com.intellij.psi.PsiElement 4 import com.intellij.psi.PsiMember 5 import com.intellij.psi.PsiPackage 6 import org.jetbrains.kotlin.asJava.elements.KtLightElement 7 import org.jetbrains.kotlin.descriptors.DeclarationDescriptor 8 import org.jetbrains.kotlin.name.FqName 9 import org.jetbrains.kotlin.resolve.BindingContext 10 import javax.inject.Inject 11 12 class KotlinElementSignatureProvider @Inject constructor( 13 val resolutionFacade: DokkaResolutionFacade 14 ) : ElementSignatureProvider { signaturenull15 override fun signature(forPsi: PsiElement): String { 16 return forPsi.extractDescriptor(resolutionFacade) 17 ?.let { signature(it) } 18 ?: run { "no desc for $forPsi in ${(forPsi as? PsiMember)?.containingClass}" } 19 } 20 signaturenull21 override fun signature(forDesc: DeclarationDescriptor): String = forDesc.signature() 22 } 23 24 25 fun PsiElement.extractDescriptor(resolutionFacade: DokkaResolutionFacade): DeclarationDescriptor? { 26 val forPsi = this 27 28 return when (forPsi) { 29 is KtLightElement<*, *> -> return (forPsi.kotlinOrigin!!).extractDescriptor(resolutionFacade) 30 is PsiPackage -> resolutionFacade.moduleDescriptor.getPackage(FqName(forPsi.qualifiedName)) 31 is PsiMember -> forPsi.getJavaOrKotlinMemberDescriptor(resolutionFacade) 32 else -> resolutionFacade.resolveSession.bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, forPsi] 33 } 34 } 35