[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.BySignatureIndexer
|
||||||
import org.jetbrains.kotlin.analysis.decompiler.psi.text.ClassNameAndSignature
|
import org.jetbrains.kotlin.analysis.decompiler.psi.text.ClassNameAndSignature
|
||||||
import org.jetbrains.kotlin.analysis.decompiler.psi.text.relativeClassName
|
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.load.kotlin.MemberSignature
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||||
import org.jetbrains.kotlin.psi.allConstructors
|
import org.jetbrains.kotlin.psi.allConstructors
|
||||||
@@ -24,28 +26,37 @@ class KotlinDeclarationInCompiledFileSearcherFE10Impl : KotlinDeclarationInCompi
|
|||||||
|
|
||||||
val memberName = member.name
|
val memberName = member.name
|
||||||
if (memberName != null && !file.isContentsLoaded && file.hasDeclarationWithKey(BySignatureIndexer, key)) {
|
if (memberName != null && !file.isContentsLoaded && file.hasDeclarationWithKey(BySignatureIndexer, key)) {
|
||||||
val topClassOrObject = file.declarations.singleOrNull() as? KtClassOrObject
|
findByStub(file, relativeClassName, member, memberName)?.let { return it }
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return file.getDeclaration(BySignatureIndexer, key)
|
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