From b05eb62d9d305ca36c308d0142687c2580a137b2 Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Sat, 10 Sep 2022 14:32:18 +0200 Subject: [PATCH] [lc] decompiled: support stub search for properties ^KT-53934 --- ...clarationInCompiledFileSearcherFE10Impl.kt | 53 +++++++++++-------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/analysis/decompiled/light-classes-for-decompiled-fe10/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/fe10/KotlinDeclarationInCompiledFileSearcherFE10Impl.kt b/analysis/decompiled/light-classes-for-decompiled-fe10/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/fe10/KotlinDeclarationInCompiledFileSearcherFE10Impl.kt index c9ccc3e3ab5..803497e8f7a 100644 --- a/analysis/decompiled/light-classes-for-decompiled-fe10/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/fe10/KotlinDeclarationInCompiledFileSearcherFE10Impl.kt +++ b/analysis/decompiled/light-classes-for-decompiled-fe10/src/org/jetbrains/kotlin/analysis/decompiled/light/classes/fe10/KotlinDeclarationInCompiledFileSearcherFE10Impl.kt @@ -12,7 +12,9 @@ import org.jetbrains.kotlin.analysis.decompiler.psi.file.KtClsFile import org.jetbrains.kotlin.analysis.decompiler.psi.text.BySignatureIndexer import org.jetbrains.kotlin.analysis.decompiler.psi.text.ClassNameAndSignature import org.jetbrains.kotlin.analysis.decompiler.psi.text.relativeClassName +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.allConstructors @@ -24,28 +26,37 @@ class KotlinDeclarationInCompiledFileSearcherFE10Impl : KotlinDeclarationInCompi val memberName = member.name if (memberName != null && !file.isContentsLoaded && file.hasDeclarationWithKey(BySignatureIndexer, key)) { - val topClassOrObject = file.declarations.singleOrNull() as? KtClassOrObject - val container: KtClassOrObject? = if (relativeClassName.isEmpty()) - topClassOrObject - else { - relativeClassName.fold(topClassOrObject) { classOrObject, name -> - classOrObject?.declarations?.singleOrNull { it.name == name.asString() } as? KtClassOrObject - } - } - - val declaration = if (member is PsiMethod && member.isConstructor) { - container?.takeIf { it.name == memberName }?.allConstructors?.singleOrNull() - } else { - container?.declarations?.singleOrNull { - it.name == memberName - } - } - - if (declaration != null) { - return declaration - } + findByStub(file, relativeClassName, member, memberName)?.let { return it } } return file.getDeclaration(BySignatureIndexer, key) } -} \ No newline at end of file +} + +private fun findByStub( + file: KtClsFile, + relativeClassName: List, + member: PsiMember, + memberName: String, +): KtDeclaration? { + val topClassOrObject = file.declarations.singleOrNull() as? KtClassOrObject + val container: KtClassOrObject = if (relativeClassName.isEmpty()) + topClassOrObject + else { + relativeClassName.fold(topClassOrObject) { classOrObject, name -> + classOrObject?.declarations?.singleOrNull { it.name == name.asString() } as? KtClassOrObject + } + } ?: return null + + return if (member is PsiMethod && member.isConstructor) { + container.takeIf { it.name == memberName }?.allConstructors?.singleOrNull() + } else { + val declarations = container.declarations + val names: Collection = if (member is PsiMethod) + member.syntheticAccessors.map(Name::asString) + memberName + else + listOf(memberName) + + declarations.singleOrNull { declaration -> declaration.name in names } + } +}