From 92d6aeb7a3f241766d3f5d7634daf6c458144923 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Mon, 20 Nov 2023 17:19:55 -0800 Subject: [PATCH] LC: lookup backing field of property in decompiled class/companion ^KTIJ-27684 --- .../jetbrains/kotlin/asJava/LightClassUtil.kt | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/LightClassUtil.kt b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/LightClassUtil.kt index 2f3616438b7..97253cb52c2 100644 --- a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/LightClassUtil.kt +++ b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/LightClassUtil.kt @@ -101,6 +101,9 @@ object LightClassUtil { fun getLightClassBackingField(declaration: KtDeclaration): PsiField? { var psiClass: PsiClass = getWrappingClass(declaration) ?: return null + var fieldFinder: (PsiField) -> Boolean = { psiField -> + psiField is KtLightElement<*, *> && psiField.kotlinOrigin === declaration + } if (psiClass is KtLightClass) { val origin = psiClass.kotlinOrigin @@ -112,15 +115,23 @@ object LightClassUtil { psiClass = containingLightClass } } + } else { + // Decompiled version of [KtLightClass] may not have [kotlinOrigin] + val containingDeclaration = declaration.containingClassOrObject + if (containingDeclaration is KtObjectDeclaration && + containingDeclaration.isCompanion() + ) { + psiClass.containingClass?.let { containingClass -> + psiClass = containingClass + fieldFinder = { psiField -> + psiField.name == declaration.name + } + } + } } } - for (field in psiClass.fields) { - if (field is KtLightField && field.kotlinOrigin === declaration) { - return field - } - } - return null + return psiClass.fields.find(fieldFinder) } fun getLightClassPropertyMethods(parameter: KtParameter): PropertyAccessorsPsiMethods {