From f8497bc339999f088b4e74e46ba941dd18ef0459 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 21 Feb 2019 14:37:40 +0300 Subject: [PATCH] FIR: extract "constructType" from type resolver --- .../kotlin/fir/resolve/ResolveUtils.kt | 54 +++++++++++++++++++ .../fir/resolve/impl/FirTypeResolverImpl.kt | 47 ++-------------- 2 files changed, 57 insertions(+), 44 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt index 0eefaa23e97..28ce7b33591 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt @@ -5,6 +5,18 @@ package org.jetbrains.kotlin.fir.resolve +import org.jetbrains.kotlin.fir.declarations.expandedConeType +import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol +import org.jetbrains.kotlin.fir.symbols.ConeClassSymbol +import org.jetbrains.kotlin.fir.symbols.ConeSymbol +import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol +import org.jetbrains.kotlin.fir.types.* +import org.jetbrains.kotlin.fir.types.impl.ConeAbbreviatedTypeImpl +import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl +import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl +import org.jetbrains.kotlin.types.Variance + inline fun MutableMap.getOrPut(key: K, defaultValue: (K) -> VA, postCompute: (VA) -> Unit): V { val value = get(key) return if (value == null) { @@ -16,3 +28,45 @@ inline fun MutableMap.getOrPut(key: K, defaultValue: (K) -> value } } + +fun ConeSymbol.constructType(typeArguments: Array, isNullable: Boolean): ConeKotlinType { + return when (this) { + is ConeTypeParameterSymbol -> { + ConeTypeParameterTypeImpl(this, isNullable) + } + is ConeClassSymbol -> { + ConeClassTypeImpl(this, typeArguments, isNullable) + } + is FirTypeAliasSymbol -> { + ConeAbbreviatedTypeImpl( + abbreviationSymbol = this as ConeClassLikeSymbol, + typeArguments = typeArguments, + directExpansion = fir.expandedConeType ?: ConeClassErrorType("Unresolved expansion"), + isNullable = isNullable + ) + } + else -> error("!") + } +} + +fun ConeSymbol.constructType(parts: List, isNullable: Boolean): ConeKotlinType = + constructType(parts.toTypeProjections(), isNullable) + +private fun List.toTypeProjections(): Array = flatMap { + it.typeArguments.map { + when (it) { + is FirStarProjection -> StarProjection + is FirTypeProjectionWithVariance -> { + val type = (it.typeRef as FirResolvedTypeRef).type + when (it.variance) { + Variance.INVARIANT -> type + Variance.IN_VARIANCE -> ConeKotlinTypeProjectionIn(type) + Variance.OUT_VARIANCE -> ConeKotlinTypeProjectionOut(type) + } + } + else -> error("!") + } + } +}.toTypedArray() + + diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt index ddf89324960..71905fa92c7 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt @@ -7,62 +7,22 @@ package org.jetbrains.kotlin.fir.resolve.impl import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.expandedConeType import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.FirQualifierResolver import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.FirTypeResolver +import org.jetbrains.kotlin.fir.resolve.constructType import org.jetbrains.kotlin.fir.scopes.FirPosition import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.service import org.jetbrains.kotlin.fir.symbols.* -import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.impl.* import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.types.Variance class FirTypeResolverImpl : FirTypeResolver { - private fun List.toTypeProjections() = flatMap { - it.typeArguments.map { - when (it) { - is FirStarProjection -> StarProjection - is FirTypeProjectionWithVariance -> { - val type = (it.typeRef as FirResolvedTypeRef).type - when (it.variance) { - Variance.INVARIANT -> type - Variance.IN_VARIANCE -> ConeKotlinTypeProjectionIn(type) - Variance.OUT_VARIANCE -> ConeKotlinTypeProjectionOut(type) - } - } - else -> error("!") - } - } - }.toTypedArray() - - private fun ConeSymbol.toConeKotlinType(parts: List, isNullable: Boolean): ConeKotlinType? { - - return when (this) { - is ConeTypeParameterSymbol -> { - ConeTypeParameterTypeImpl(this, isNullable) - } - is ConeClassSymbol -> { - ConeClassTypeImpl(this, parts.toTypeProjections(), isNullable) - } - is FirTypeAliasSymbol -> { - ConeAbbreviatedTypeImpl( - abbreviationSymbol = this as ConeClassLikeSymbol, - typeArguments = parts.toTypeProjections(), - directExpansion = fir.expandedConeType ?: ConeClassErrorType("Unresolved expansion"), - isNullable = isNullable - ) - } - else -> error("!") - } - } - private data class ClassIdInSession(val session: FirSession, val id: ClassId) private val implicitBuiltinTypeSymbols = mutableMapOf() @@ -119,8 +79,7 @@ class FirTypeResolverImpl : FirTypeResolver { override fun resolveUserType(typeRef: FirUserTypeRef, symbol: ConeSymbol?, scope: FirScope): ConeKotlinType { symbol ?: return ConeKotlinErrorType("Symbol not found, for `${typeRef.render()}`") - return symbol.toConeKotlinType(typeRef.qualifier, typeRef.isMarkedNullable) - ?: ConeKotlinErrorType("Failed to resolve qualified type") + return symbol.constructType(typeRef.qualifier, typeRef.isMarkedNullable) } override fun resolveType( @@ -146,7 +105,7 @@ class FirTypeResolverImpl : FirTypeResolver { ) } is FirImplicitBuiltinTypeRef -> { - resolveToSymbol(typeRef, scope, position)!!.toConeKotlinType(emptyList(), isNullable = false)!! + resolveToSymbol(typeRef, scope, position)!!.constructType(emptyList(), isNullable = false) } is FirDynamicTypeRef, is FirImplicitTypeRef, is FirDelegatedTypeRef -> { ConeKotlinErrorType("Not supported: ${typeRef::class.simpleName}")