SLC: find property accessor PSI from containing property PSI
...so that auxiliaryOriginalElement used by UAST can be set properly
^KT-70458 fixed
diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt
index 27a1d89..258fffd 100644
--- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt
+++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/symbolLightClassUtils.kt
@@ -389,11 +389,30 @@
}
fun createSymbolLightAccessorMethod(accessor: KaPropertyAccessorSymbol): SymbolLightAccessorMethod {
+ // [KtFakeSourceElementKind.DelegatedPropertyAccessor] is not allowed as source PSI, e.g.,
+ //
+ // val p by delegate(...)
+ //
+ // However, we also lose the source PSI of a custom property accessor, e.g.,
+ //
+ // val p by delegate(...)
+ // get() = ...
+ //
+ // We go upward to the property's source PSI and attempt to find/bind accessor's source PSI.
+ fun sourcePsiFromProperty(): KtPropertyAccessor? {
+ if (accessor.origin != KaSymbolOrigin.SOURCE) return null
+ val propertyPsi = declaration.psi as? KtProperty ?: return null
+ return if (accessor is KaPropertyGetterSymbol)
+ propertyPsi.getter
+ else
+ propertyPsi.setter
+ }
+
val lightMemberOrigin = originalElement?.let {
LightMemberOriginForDeclaration(
originalElement = it,
originKind = JvmDeclarationOriginKind.OTHER,
- auxiliaryOriginalElement = accessor.sourcePsiSafe<KtDeclaration>()
+ auxiliaryOriginalElement = accessor.sourcePsiSafe<KtDeclaration>() ?: sourcePsiFromProperty()
)
}