diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10ReceiverParameterSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10ReceiverParameterSymbol.kt index eac2045f9b3..d86f9251ee0 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10ReceiverParameterSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10ReceiverParameterSymbol.kt @@ -7,12 +7,14 @@ package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.KtFe10DescSymbol +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtSymbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtReceiverParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.types.KtType -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor class KtFe10ReceiverParameterSymbol( @@ -25,6 +27,9 @@ class KtFe10ReceiverParameterSymbol( override val descriptor: ReceiverParameterDescriptor get() = withValidityAssertion { _descriptor } + override val owningCallableSymbol: KtCallableSymbol + get() = withValidityAssertion { _descriptor.containingDeclaration.toKtSymbol(analysisContext) as KtCallableSymbol } + override fun createPointer(): KtSymbolPointer = withValidityAssertion { TODO("Not yet implemented") } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt index 61918d044ca..57307c49520 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol @@ -36,6 +37,8 @@ internal class KtFirReceiverParameterSymbol( ?: error("$firSymbol doesn't have an extension receiver.") } + override val owningCallableSymbol: KtCallableSymbol by cached { builder.callableBuilder.buildCallableSymbol(firSymbol) } + override val origin: KtSymbolOrigin = withValidityAssertion { firSymbol.fir.ktSymbolOrigin() } override fun createPointer(): KtSymbolPointer = withValidityAssertion { diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtCallableSymbol.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtCallableSymbol.kt index b387de70690..ba4fd0274a8 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtCallableSymbol.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtCallableSymbol.kt @@ -5,10 +5,8 @@ package org.jetbrains.kotlin.analysis.api.symbols -import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtPossibleMemberSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithKind -import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithTypeParameters import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.name.CallableId @@ -29,4 +27,10 @@ public sealed class KtCallableSymbol : KtSymbolWithKind, KtPossibleMemberSymbol, */ public abstract class KtReceiverParameterSymbol : KtSymbol { public abstract val type: KtType + + /** + * Link to the corresponding function or property. + * In terms of the example above -- this is link to the function foo. + */ + public abstract val owningCallableSymbol: KtCallableSymbol } \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.descriptors.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.descriptors.txt index 49a00e0a375..446e3fc9825 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.descriptors.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.descriptors.txt @@ -5,6 +5,7 @@ KtSuccessCallInfo: dispatchReceiver = KtImplicitReceiverValue: symbol = KtReceiverParameterSymbol: origin: SOURCE + owningCallableSymbol: KtAnonymousFunctionSymbol(/) type: test/Target type = test.Target extensionReceiver = null diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.txt index 061e5d7522e..9bcecbed816 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.txt @@ -5,6 +5,7 @@ KtSuccessCallInfo: dispatchReceiver = KtImplicitReceiverValue: symbol = KtReceiverParameterSymbol: origin: SOURCE + owningCallableSymbol: KtAnonymousFunctionSymbol(/) type: test/Target type = test.Target extensionReceiver = null diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/javaPropertyGetter_unqualified.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/javaPropertyGetter_unqualified.txt index a1127a54bd6..f68ebcf152c 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/javaPropertyGetter_unqualified.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/javaPropertyGetter_unqualified.txt @@ -4,6 +4,7 @@ KtSuccessCallInfo: dispatchReceiver = KtImplicitReceiverValue: symbol = KtReceiverParameterSymbol: origin: SOURCE + owningCallableSymbol: KtFunctionSymbol(/call) type: JavaClass type = JavaClass extensionReceiver = null diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/javaPropertySetter_unqualified.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/javaPropertySetter_unqualified.txt index 7b43be752f9..47f01f6bf1e 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/javaPropertySetter_unqualified.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/javaPropertySetter_unqualified.txt @@ -4,6 +4,7 @@ KtSuccessCallInfo: dispatchReceiver = KtImplicitReceiverValue: symbol = KtReceiverParameterSymbol: origin: SOURCE + owningCallableSymbol: KtFunctionSymbol(/call) type: JavaClass type = JavaClass extensionReceiver = null diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/kotlinPropertyGetter_unqualified.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/kotlinPropertyGetter_unqualified.txt index dcc73afa08d..1d4d9dd438a 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/kotlinPropertyGetter_unqualified.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/kotlinPropertyGetter_unqualified.txt @@ -4,6 +4,7 @@ KtSuccessCallInfo: dispatchReceiver = KtImplicitReceiverValue: symbol = KtReceiverParameterSymbol: origin: SOURCE + owningCallableSymbol: KtFunctionSymbol(/foo) type: A type = A extensionReceiver = null diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/kotlinPropertySetter_unqualified.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/kotlinPropertySetter_unqualified.txt index 34dea21cc00..339fa4d1dc9 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/kotlinPropertySetter_unqualified.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/kotlinPropertySetter_unqualified.txt @@ -4,6 +4,7 @@ KtSuccessCallInfo: dispatchReceiver = KtImplicitReceiverValue: symbol = KtReceiverParameterSymbol: origin: SOURCE + owningCallableSymbol: KtFunctionSymbol(/foo) type: A type = A extensionReceiver = null diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastImplicitDispatchReceiver.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastImplicitDispatchReceiver.txt index 66aa6fc9a86..ff19aeda24c 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastImplicitDispatchReceiver.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastImplicitDispatchReceiver.txt @@ -5,6 +5,7 @@ KtSuccessCallInfo: original = KtImplicitReceiverValue: symbol = KtReceiverParameterSymbol: origin: SOURCE + owningCallableSymbol: KtFunctionSymbol(/test) type: kotlin/Any type = kotlin.Any type = kotlin.String diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastImplicitExtensionReceiver.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastImplicitExtensionReceiver.txt index 81460ce0f70..6d302cb3b9b 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastImplicitExtensionReceiver.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastImplicitExtensionReceiver.txt @@ -7,6 +7,7 @@ KtSuccessCallInfo: original = KtImplicitReceiverValue: symbol = KtReceiverParameterSymbol: origin: SOURCE + owningCallableSymbol: KtFunctionSymbol(/test) type: kotlin/Any type = kotlin.Any type = kotlin.String diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.descriptors.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.descriptors.txt index 4d30c2f47dc..8a90fc4ddfa 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.descriptors.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.descriptors.txt @@ -5,6 +5,7 @@ KtApplicableCallCandidateInfo: dispatchReceiver = KtImplicitReceiverValue: symbol = KtReceiverParameterSymbol: origin: SOURCE + owningCallableSymbol: KtAnonymousFunctionSymbol(/) type: test/Target type = test.Target extensionReceiver = null diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.txt index 536432c8673..ce85af37943 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.txt @@ -5,6 +5,7 @@ KtApplicableCallCandidateInfo: dispatchReceiver = KtImplicitReceiverValue: symbol = KtReceiverParameterSymbol: origin: SOURCE + owningCallableSymbol: KtAnonymousFunctionSymbol(/) type: test/Target type = test.Target extensionReceiver = null