FIR IDE: API to resolve KtTypeReference to KtType

This commit is contained in:
Jinseong Jeon
2021-07-15 22:03:27 -07:00
committed by Ilya Kirillov
parent 5358d4f07c
commit f02f3c76ae
2 changed files with 22 additions and 0 deletions
@@ -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)
}
@@ -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<FirResolvedTypeRef>(firResolveState).coneType.asKtType()
}
override fun withNullability(type: KtType, newNullability: KtTypeNullability): KtType {
require(type is KtFirType)
return type.coneType.withNullability(newNullability.toConeNullability(), rootModuleSession.typeContext).asKtType()