FIR IDE/UAST: get PsiType from KtTypeReference

This commit is contained in:
Jinseong Jeon
2021-06-01 10:59:07 -07:00
committed by teamcityserver
parent a3710bed6a
commit 47ede5bdc8
21 changed files with 175 additions and 26 deletions
+1
View File
@@ -9,6 +9,7 @@ dependencies {
compileOnly(project(":compiler:psi"))
compileOnly(project(":compiler:frontend"))
compileOnly(project(":core:compiler.common"))
compileOnly(project(":core:compiler.common.jvm"))
compileOnly(project(":idea:idea-frontend-independent"))
compileOnly(intellijCoreDep())
compileOnly(intellijDep())
@@ -5,10 +5,13 @@
package org.jetbrains.kotlin.idea.frontend.api.components
import com.intellij.psi.PsiType
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.load.kotlin.TypeMappingMode
import org.jetbrains.kotlin.psi.KtTypeReference
abstract class KtTypeProvider : KtAnalysisSessionComponent() {
abstract val builtinTypes: KtBuiltinTypes
@@ -17,6 +20,8 @@ abstract class KtTypeProvider : KtAnalysisSessionComponent() {
abstract fun buildSelfClassType(symbol: KtNamedClassOrObjectSymbol): KtType
abstract fun getPsiType(ktTypeReference: KtTypeReference, mode: TypeMappingMode): PsiType
abstract fun withNullability(type: KtType, newNullability: KtTypeNullability): KtType
}
@@ -36,6 +41,9 @@ interface KtTypeProviderMixIn : KtAnalysisSessionMixIn {
fun KtNamedClassOrObjectSymbol.buildSelfClassType(): KtType =
analysisSession.typeProvider.buildSelfClassType(this)
fun KtTypeReference.getPsiType(mode: TypeMappingMode = TypeMappingMode.DEFAULT): PsiType =
analysisSession.typeProvider.getPsiType(this, mode)
fun KtType.withNullability(newNullability: KtTypeNullability): KtType =
analysisSession.typeProvider.withNullability(this, newNullability)
}
@@ -60,4 +68,4 @@ abstract class KtBuiltinTypes : ValidityTokenOwner {
abstract val NULLABLE_ANY: KtType
abstract val NULLABLE_NOTHING: KtType
}
}
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.components
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic
@@ -14,9 +15,11 @@ import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.typeContext
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.ConeTypeCheckerContext
import org.jetbrains.kotlin.idea.asJava.asPsiType
import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnosticWithPsi
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.fir.diagnostics.KT_DIAGNOSTIC_CONVERTER
import org.jetbrains.kotlin.load.kotlin.TypeMappingMode
internal interface KtFirAnalysisSessionComponent {
val analysisSession: KtFirAnalysisSession
@@ -27,6 +30,9 @@ internal interface KtFirAnalysisSessionComponent {
fun ConeKotlinType.asKtType() = analysisSession.firSymbolBuilder.typeBuilder.buildKtType(this)
fun ConeKotlinType.asPsiType(mode: TypeMappingMode, psiContext: PsiElement) =
asPsiType(rootModuleSession, analysisSession.firResolveState, mode, psiContext)
fun FirPsiDiagnostic<*>.asKtDiagnostic(): KtDiagnosticWithPsi<*> =
KT_DIAGNOSTIC_CONVERTER.convert(analysisSession, this as FirDiagnostic<*>)
@@ -18,7 +18,6 @@ import org.jetbrains.kotlin.fir.typeContext
import org.jetbrains.kotlin.fir.types.ConeClassErrorType
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.idea.asJava.asPsiType
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.fir.low.level.api.api.getOrBuildFirSafe
@@ -63,9 +62,6 @@ internal class KtFirExpressionTypeProvider(
}
}
private fun ConeKotlinType.asPsiType(mode: TypeMappingMode, psiContext: PsiElement) =
asPsiType(rootModuleSession, analysisSession.firResolveState, mode, psiContext)
private fun FirNamedReference.getReferencedElementType(): ConeKotlinType {
val symbols = when (this) {
is FirResolvedNamedReference -> listOf(resolvedSymbol)
@@ -5,11 +5,15 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.components
import com.intellij.psi.PsiType
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.typeContext
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.frontend.api.components.KtBuiltinTypes
import org.jetbrains.kotlin.idea.frontend.api.components.KtTypeProvider
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
@@ -21,6 +25,9 @@ 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.load.kotlin.TypeMappingMode
import org.jetbrains.kotlin.psi.KtTypeReference
internal class KtFirTypeProvider(
override val analysisSession: KtFirAnalysisSession,
@@ -39,7 +46,6 @@ internal class KtFirTypeProvider(
return approximatedConeType?.asKtType()
}
override fun buildSelfClassType(symbol: KtNamedClassOrObjectSymbol): KtType {
require(symbol is KtFirNamedClassOrObjectSymbol)
val type = symbol.firRef.withFir(FirResolvePhase.SUPER_TYPES) { firClass ->
@@ -52,6 +58,14 @@ internal class KtFirTypeProvider(
return type.asKtType()
}
override fun getPsiType(ktTypeReference: KtTypeReference, mode: TypeMappingMode): PsiType = withValidityAssertion {
when (val fir = ktTypeReference.getOrBuildFir(firResolveState)) {
// NB: [FirErrorTypeRef] is a subtype of [FirResolvedTypeRef], and the error type in it will be properly handled by [asPsiType].
is FirResolvedTypeRef -> fir.coneType.asPsiType(mode, ktTypeReference)
else -> error("Unexpected ${fir::class}")
}
}
override fun withNullability(type: KtType, newNullability: KtTypeNullability): KtType {
require(type is KtFirType)
return type.coneType.withNullability(newNullability.toConeNullability(), rootModuleSession.typeContext).asKtType()