diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/components/KtTypeProvider.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/components/KtTypeProvider.kt index b98a2dc64e4..8f44515af8f 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/components/KtTypeProvider.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/components/KtTypeProvider.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.symbols.KtNamedClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.types.KtTypeNullability +import org.jetbrains.kotlin.psi.KtTypeReference public abstract class KtTypeProvider : KtAnalysisSessionComponent() { public abstract val builtinTypes: KtBuiltinTypes @@ -17,6 +18,8 @@ public abstract class KtTypeProvider : KtAnalysisSessionComponent() { public abstract fun buildSelfClassType(symbol: KtNamedClassOrObjectSymbol): KtType + public abstract fun getKtType(ktTypeReference: KtTypeReference): KtType + public abstract fun withNullability(type: KtType, newNullability: KtTypeNullability): KtType } @@ -38,6 +41,14 @@ public interface KtTypeProviderMixIn : KtAnalysisSessionMixIn { public fun KtNamedClassOrObjectSymbol.buildSelfClassType(): KtType = analysisSession.typeProvider.buildSelfClassType(this) + /** + * Resolve [KtTypeReference] and return corresponding [KtType] if resolved. + * + * This may raise an exception if the resolution ends up with an unexpected kind. + */ + public fun KtTypeReference.getKtType(): KtType = + analysisSession.typeProvider.getKtType(this) + public fun KtType.withNullability(newNullability: KtTypeNullability): KtType = analysisSession.typeProvider.withNullability(this, newNullability) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirTypeProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirTypeProvider.kt index 41f23055fbc..a6bbf401c4d 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirTypeProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirTypeProvider.kt @@ -7,9 +7,14 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.components import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.typeContext +import org.jetbrains.kotlin.fir.types.FirErrorTypeRef +import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef +import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl import org.jetbrains.kotlin.fir.types.withNullability +import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFir +import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirOfType import org.jetbrains.kotlin.idea.frontend.api.components.KtBuiltinTypes import org.jetbrains.kotlin.idea.frontend.api.components.KtTypeProvider import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession @@ -21,6 +26,8 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.KtNamedClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.types.KtTypeNullability +import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion +import org.jetbrains.kotlin.psi.KtTypeReference internal class KtFirTypeProvider( override val analysisSession: KtFirAnalysisSession, @@ -51,6 +58,10 @@ internal class KtFirTypeProvider( return type.asKtType() } + override fun getKtType(ktTypeReference: KtTypeReference): KtType = withValidityAssertion { + ktTypeReference.getOrBuildFirOfType(firResolveState).coneType.asKtType() + } + override fun withNullability(type: KtType, newNullability: KtTypeNullability): KtType { require(type is KtFirType) return type.coneType.withNullability(newNullability.toConeNullability(), rootModuleSession.typeContext).asKtType()