diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt index e9ff66b5ab4..f4130d98cf4 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt @@ -19,14 +19,12 @@ import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.requireOwnerPointe import org.jetbrains.kotlin.analysis.api.fir.utils.cached import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion -import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.UnsupportedSymbolKind +import org.jetbrains.kotlin.analysis.api.symbols.pointers.symbolPointerDelegator import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.descriptors.Modality @@ -127,7 +125,15 @@ internal class KtFirKotlinPropertySymbol( override val hasSetter: Boolean get() = withValidityAssertion { firSymbol.setterSymbol != null } override fun createPointer(): KtSymbolPointer = withValidityAssertion { - KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } + KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { psiPointer -> + return symbolPointerDelegator(psiPointer) { + when (it) { + is KtKotlinPropertySymbol -> it + is KtValueParameterSymbol -> it.generatedPrimaryConstructorProperty + else -> null + } + } + } return when (val kind = symbolKind) { KtSymbolKind.TOP_LEVEL -> KtFirTopLevelPropertySymbolPointer(firSymbol.callableId, firSymbol.createSignature()) diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtSymbolPointer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtSymbolPointer.kt index 4dacdf297f7..95b009d801e 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtSymbolPointer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtSymbolPointer.kt @@ -38,3 +38,14 @@ public inline fun symbolPointer(crossinline getSymbol: (KtAnalysi @Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol") override fun restoreSymbol(analysisSession: KtAnalysisSession): S? = getSymbol(analysisSession) } + +public inline fun symbolPointerDelegator( + pointer: KtSymbolPointer, + crossinline transformer: context(KtAnalysisSession) (T) -> R?, +): KtSymbolPointer = object : KtSymbolPointer() { + @Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol") + override fun restoreSymbol(analysisSession: KtAnalysisSession): R? = with(analysisSession) { + val symbol = pointer.restoreSymbol() ?: return null + transformer(this, symbol) + } +} diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/primaryConstructorValueParameterAsProperty.kt b/analysis/analysis-api/testData/symbols/symbolByReference/primaryConstructorValueParameterAsProperty.kt index ac96c3309be..dae4c7c113a 100644 --- a/analysis/analysis-api/testData/symbols/symbolByReference/primaryConstructorValueParameterAsProperty.kt +++ b/analysis/analysis-api/testData/symbols/symbolByReference/primaryConstructorValueParameterAsProperty.kt @@ -1,4 +1,4 @@ -// DO_NOT_CHECK_SYMBOL_RESTORE +// DO_NOT_CHECK_SYMBOL_RESTORE_K1 class A(val abc: Int) { fun check() {