[lc] decompiled: support stub search for properties

^KT-53934
This commit is contained in:
Dmitry Gridin
2022-09-10 14:32:18 +02:00
committed by Space
parent 7ec55f885d
commit b05eb62d9d
@@ -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)
}
}
}
private fun findByStub(
file: KtClsFile,
relativeClassName: List<Name>,
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<String> = if (member is PsiMethod)
member.syntheticAccessors.map(Name::asString) + memberName
else
listOf(memberName)
declarations.singleOrNull { declaration -> declaration.name in names }
}
}