[lc] decompiled: support stub search for properties
^KT-53934
This commit is contained in:
+32
-21
@@ -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 }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user