diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt index d90631cf905..cc5e3f2b680 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt @@ -5,18 +5,6 @@ package org.jetbrains.kotlin.analysis.api.fir.components -import org.jetbrains.kotlin.fir.analysis.checkers.ConeTypeCompatibilityChecker -import org.jetbrains.kotlin.fir.analysis.checkers.ConeTypeCompatibilityChecker.isCompatible -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase -import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess -import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall -import org.jetbrains.kotlin.fir.expressions.FirGetClassCall -import org.jetbrains.kotlin.fir.typeContext -import org.jetbrains.kotlin.fir.types.* -import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl -import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.throwUnexpectedFirElementError import org.jetbrains.kotlin.analysis.api.components.KtBuiltinTypes import org.jetbrains.kotlin.analysis.api.components.KtTypeProvider import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession @@ -29,8 +17,22 @@ import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability import org.jetbrains.kotlin.analysis.api.withValidityAssertion +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LowLevelFirApiFacadeForResolveOnAir.getTowerContextProvider +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.throwUnexpectedFirElementError +import org.jetbrains.kotlin.fir.analysis.checkers.ConeTypeCompatibilityChecker +import org.jetbrains.kotlin.fir.analysis.checkers.ConeTypeCompatibilityChecker.isCompatible +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess +import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall +import org.jetbrains.kotlin.fir.expressions.FirGetClassCall +import org.jetbrains.kotlin.fir.typeContext +import org.jetbrains.kotlin.fir.types.* +import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl +import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.psi.KtDoubleColonExpression +import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtTypeReference internal class KtFirTypeProvider( @@ -103,5 +105,10 @@ internal class KtFirTypeProvider( b.coneType ) == ConeTypeCompatibilityChecker.Compatibility.COMPATIBLE } + + override fun getImplicitReceiverTypesAtPosition(position: KtElement): List { + return analysisSession.firResolveState.getTowerContextProvider() + .getClosestAvailableParentContext(position)?.implicitReceiverStack?.map { it.type.asKtType() } ?: emptyList() + } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtTypeProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtTypeProvider.kt index 9e8209a6d09..eec8c61a8b2 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtTypeProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtTypeProvider.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.api.types.KtFlexibleType import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability import org.jetbrains.kotlin.psi.KtDoubleColonExpression +import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtTypeReference public abstract class KtTypeProvider : KtAnalysisSessionComponent() { @@ -29,6 +30,8 @@ public abstract class KtTypeProvider : KtAnalysisSessionComponent() { public abstract fun withNullability(type: KtType, newNullability: KtTypeNullability): KtType public abstract fun haveCommonSubtype(a: KtType, b: KtType): Boolean + + public abstract fun getImplicitReceiverTypesAtPosition(position: KtElement): List } public interface KtTypeProviderMixIn : KtAnalysisSessionMixIn { @@ -81,6 +84,13 @@ public interface KtTypeProviderMixIn : KtAnalysisSessionMixIn { /** Check whether this type is compatible with that type. If they are compatible, it means they can have a common subtype. */ public fun KtType.hasCommonSubTypeWith(that: KtType): Boolean = analysisSession.typeProvider.haveCommonSubtype(this, that) + + /** + * Gets all the implicit receiver types available at the given position. The type of the outermost receiver appears at the beginning + * of the returned list. + */ + public fun getImplicitReceiverTypesAtPosition(position: KtElement): List = + analysisSession.typeProvider.getImplicitReceiverTypesAtPosition(position) } @Suppress("PropertyName")