[lc] decompiled: support stub search for top level callable

^KT-53934
This commit is contained in:
Dmitry Gridin
2022-09-12 18:02:25 +02:00
committed by Space
parent 9eb2672282
commit 7013fa1864
2 changed files with 23 additions and 20 deletions
@@ -13,11 +13,9 @@ import org.jetbrains.kotlin.analysis.decompiler.psi.file.KtClsFile
import org.jetbrains.kotlin.asJava.syntheticAccessors
import org.jetbrains.kotlin.load.kotlin.MemberSignature
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.allConstructors
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.type.MapPsiToAsmDesc
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
abstract class KotlinDeclarationInCompiledFileSearcher {
abstract fun findDeclarationInCompiledFile(file: KtClsFile, member: PsiMember, signature: MemberSignature): KtDeclaration?
@@ -46,23 +44,23 @@ abstract class KotlinDeclarationInCompiledFileSearcher {
member: PsiMember,
memberName: String,
): KtDeclaration? {
val topClassOrObject = file.declarations.singleOrNull() as? KtClassOrObject
val container: KtClassOrObject = if (relativeClassName.isEmpty())
topClassOrObject
val classOrFile: KtDeclarationContainer = file.declarations.singleOrNull() as? KtClassOrObject ?: file
val container: KtDeclarationContainer = if (relativeClassName.isEmpty())
classOrFile
else {
relativeClassName.fold(topClassOrObject) { classOrObject, name ->
classOrObject?.declarations?.singleOrNull { it.name == name.asString() } as? KtClassOrObject
relativeClassName.fold(classOrFile) { declaration: KtDeclarationContainer?, name: Name ->
declaration?.declarations?.singleOrNull() { it is KtClassOrObject && it.name == name.asString() } as? KtClassOrObject
}
} ?: return null
if (member is PsiMethod && member.isConstructor) {
return container.takeIf { it.name == memberName }?.allConstructors?.singleOrNull()
return container.safeAs<KtClassOrObject>()?.takeIf { it.name == memberName }?.allConstructors?.singleOrNull()
}
val declarations = container.declarations
return when (member) {
is PsiMethod -> {
val names = member.syntheticAccessors.map(Name::asString) + memberName
val names = member.syntheticAccessors(withoutOverrideCheck = true).map(Name::asString) + memberName
declarations.singleOrNull { it.name in names }
}