FIR IDE: API to resolve KtTypeReference to KtType
This commit is contained in:
committed by
Ilya Kirillov
parent
5358d4f07c
commit
f02f3c76ae
+11
@@ -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.symbols.KtNamedClassOrObjectSymbol
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
|
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.types.KtTypeNullability
|
||||||
|
import org.jetbrains.kotlin.psi.KtTypeReference
|
||||||
|
|
||||||
public abstract class KtTypeProvider : KtAnalysisSessionComponent() {
|
public abstract class KtTypeProvider : KtAnalysisSessionComponent() {
|
||||||
public abstract val builtinTypes: KtBuiltinTypes
|
public abstract val builtinTypes: KtBuiltinTypes
|
||||||
@@ -17,6 +18,8 @@ public abstract class KtTypeProvider : KtAnalysisSessionComponent() {
|
|||||||
|
|
||||||
public abstract fun buildSelfClassType(symbol: KtNamedClassOrObjectSymbol): KtType
|
public abstract fun buildSelfClassType(symbol: KtNamedClassOrObjectSymbol): KtType
|
||||||
|
|
||||||
|
public abstract fun getKtType(ktTypeReference: KtTypeReference): KtType
|
||||||
|
|
||||||
public abstract fun withNullability(type: KtType, newNullability: KtTypeNullability): KtType
|
public abstract fun withNullability(type: KtType, newNullability: KtTypeNullability): KtType
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -38,6 +41,14 @@ public interface KtTypeProviderMixIn : KtAnalysisSessionMixIn {
|
|||||||
public fun KtNamedClassOrObjectSymbol.buildSelfClassType(): KtType =
|
public fun KtNamedClassOrObjectSymbol.buildSelfClassType(): KtType =
|
||||||
analysisSession.typeProvider.buildSelfClassType(this)
|
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 =
|
public fun KtType.withNullability(newNullability: KtTypeNullability): KtType =
|
||||||
analysisSession.typeProvider.withNullability(this, newNullability)
|
analysisSession.typeProvider.withNullability(this, newNullability)
|
||||||
}
|
}
|
||||||
|
|||||||
+11
@@ -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.declarations.FirResolvePhase
|
||||||
import org.jetbrains.kotlin.fir.typeContext
|
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.ConeClassLikeTypeImpl
|
||||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||||
import org.jetbrains.kotlin.fir.types.withNullability
|
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.KtBuiltinTypes
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.components.KtTypeProvider
|
import org.jetbrains.kotlin.idea.frontend.api.components.KtTypeProvider
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
|
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.tokens.ValidityToken
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
|
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.types.KtTypeNullability
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion
|
||||||
|
import org.jetbrains.kotlin.psi.KtTypeReference
|
||||||
|
|
||||||
internal class KtFirTypeProvider(
|
internal class KtFirTypeProvider(
|
||||||
override val analysisSession: KtFirAnalysisSession,
|
override val analysisSession: KtFirAnalysisSession,
|
||||||
@@ -51,6 +58,10 @@ internal class KtFirTypeProvider(
|
|||||||
return type.asKtType()
|
return type.asKtType()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getKtType(ktTypeReference: KtTypeReference): KtType = withValidityAssertion {
|
||||||
|
ktTypeReference.getOrBuildFirOfType<FirResolvedTypeRef>(firResolveState).coneType.asKtType()
|
||||||
|
}
|
||||||
|
|
||||||
override fun withNullability(type: KtType, newNullability: KtTypeNullability): KtType {
|
override fun withNullability(type: KtType, newNullability: KtTypeNullability): KtType {
|
||||||
require(type is KtFirType)
|
require(type is KtFirType)
|
||||||
return type.coneType.withNullability(newNullability.toConeNullability(), rootModuleSession.typeContext).asKtType()
|
return type.coneType.withNullability(newNullability.toConeNullability(), rootModuleSession.typeContext).asKtType()
|
||||||
|
|||||||
Reference in New Issue
Block a user