FIR IDE: Add API to get implicit receiver types at a position
This will be used in completion contribution.
This commit is contained in:
committed by
Ilya Kirillov
parent
14452661cc
commit
3b48103cd2
+19
-12
@@ -5,18 +5,6 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.analysis.api.fir.components
|
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.KtBuiltinTypes
|
||||||
import org.jetbrains.kotlin.analysis.api.components.KtTypeProvider
|
import org.jetbrains.kotlin.analysis.api.components.KtTypeProvider
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
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.KtType
|
||||||
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
|
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
|
||||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
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.name.StandardClassIds
|
||||||
import org.jetbrains.kotlin.psi.KtDoubleColonExpression
|
import org.jetbrains.kotlin.psi.KtDoubleColonExpression
|
||||||
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import org.jetbrains.kotlin.psi.KtTypeReference
|
import org.jetbrains.kotlin.psi.KtTypeReference
|
||||||
|
|
||||||
internal class KtFirTypeProvider(
|
internal class KtFirTypeProvider(
|
||||||
@@ -103,5 +105,10 @@ internal class KtFirTypeProvider(
|
|||||||
b.coneType
|
b.coneType
|
||||||
) == ConeTypeCompatibilityChecker.Compatibility.COMPATIBLE
|
) == ConeTypeCompatibilityChecker.Compatibility.COMPATIBLE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getImplicitReceiverTypesAtPosition(position: KtElement): List<KtType> {
|
||||||
|
return analysisSession.firResolveState.getTowerContextProvider()
|
||||||
|
.getClosestAvailableParentContext(position)?.implicitReceiverStack?.map { it.type.asKtType() } ?: emptyList()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+10
@@ -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.KtType
|
||||||
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
|
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
|
||||||
import org.jetbrains.kotlin.psi.KtDoubleColonExpression
|
import org.jetbrains.kotlin.psi.KtDoubleColonExpression
|
||||||
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import org.jetbrains.kotlin.psi.KtTypeReference
|
import org.jetbrains.kotlin.psi.KtTypeReference
|
||||||
|
|
||||||
public abstract class KtTypeProvider : KtAnalysisSessionComponent() {
|
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 withNullability(type: KtType, newNullability: KtTypeNullability): KtType
|
||||||
|
|
||||||
public abstract fun haveCommonSubtype(a: KtType, b: KtType): Boolean
|
public abstract fun haveCommonSubtype(a: KtType, b: KtType): Boolean
|
||||||
|
|
||||||
|
public abstract fun getImplicitReceiverTypesAtPosition(position: KtElement): List<KtType>
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface KtTypeProviderMixIn : KtAnalysisSessionMixIn {
|
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. */
|
/** 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)
|
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<KtType> =
|
||||||
|
analysisSession.typeProvider.getImplicitReceiverTypesAtPosition(position)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("PropertyName")
|
@Suppress("PropertyName")
|
||||||
|
|||||||
Reference in New Issue
Block a user