FIR: Do not retrieve symbol for type construction

This commit is contained in:
Denis Zharkov
2020-05-12 17:43:03 +03:00
parent 25bee057e0
commit e7e84b18cd
5 changed files with 16 additions and 16 deletions
@@ -186,7 +186,7 @@ class FirSyntheticCallGenerator(
val (typeParameter, returnType) = generateSyntheticSelectTypeParameter() val (typeParameter, returnType) = generateSyntheticSelectTypeParameter()
val argumentType = buildResolvedTypeRef { type = returnType.coneTypeUnsafe<ConeKotlinType>().createArrayOf(session) } val argumentType = buildResolvedTypeRef { type = returnType.coneTypeUnsafe<ConeKotlinType>().createArrayOf() }
val typeArgument = buildTypeProjectionWithVariance { val typeArgument = buildTypeProjectionWithVariance {
typeRef = returnType typeRef = returnType
variance = Variance.INVARIANT variance = Variance.INVARIANT
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.resolve.transformers
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock
import org.jetbrains.kotlin.fir.references.* import org.jetbrains.kotlin.fir.references.*
import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
@@ -94,7 +93,7 @@ internal fun FirValueParameter.transformVarargTypeToArrayType() {
val returnType = returnTypeRef.coneTypeUnsafe<ConeKotlinType>() val returnType = returnTypeRef.coneTypeUnsafe<ConeKotlinType>()
transformReturnTypeRef( transformReturnTypeRef(
StoreType, StoreType,
returnTypeRef.withReplacedConeType(ConeKotlinTypeProjectionOut(returnType).createArrayOf(session)) returnTypeRef.withReplacedConeType(ConeKotlinTypeProjectionOut(returnType).createArrayOf())
) )
} }
} }
@@ -32,7 +32,6 @@ import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType
import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.symbols.StandardClassIds
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.symbols.invoke
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.builder.* import org.jetbrains.kotlin.fir.types.builder.*
import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.fir.visitors.*
@@ -484,7 +483,6 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
override fun transformGetClassCall(getClassCall: FirGetClassCall, data: ResolutionMode): CompositeTransformResult<FirStatement> { override fun transformGetClassCall(getClassCall: FirGetClassCall, data: ResolutionMode): CompositeTransformResult<FirStatement> {
val transformedGetClassCall = transformExpression(getClassCall, data).single as FirGetClassCall val transformedGetClassCall = transformExpression(getClassCall, data).single as FirGetClassCall
val kClassSymbol = ClassId.fromString("kotlin/reflect/KClass")(session.firSymbolProvider)
val typeOfExpression = when (val lhs = transformedGetClassCall.argument) { val typeOfExpression = when (val lhs = transformedGetClassCall.argument) {
is FirResolvedQualifier -> { is FirResolvedQualifier -> {
@@ -514,7 +512,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
transformedGetClassCall.resultType = transformedGetClassCall.resultType =
buildResolvedTypeRef { buildResolvedTypeRef {
type = kClassSymbol.constructType(arrayOf(typeOfExpression), false) type = ClassId.fromString("kotlin/reflect/KClass").constructClassLikeType(arrayOf(typeOfExpression), false)
} }
return transformedGetClassCall.compose() return transformedGetClassCall.compose()
} }
@@ -6,16 +6,10 @@
package org.jetbrains.kotlin.fir.types package org.jetbrains.kotlin.fir.types
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.constructType
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.symbols.StandardClassIds
import org.jetbrains.kotlin.fir.symbols.invoke
fun ConeTypeProjection.createArrayOf(session: FirSession, nullable: Boolean = false): ConeKotlinType { fun ConeTypeProjection.createArrayOf(nullable: Boolean = false): ConeKotlinType {
val symbolProvider: FirSymbolProvider = session.firSymbolProvider
if (this is ConeKotlinTypeProjection) { if (this is ConeKotlinTypeProjection) {
val type = type.lowerBoundIfFlexible() val type = type.lowerBoundIfFlexible()
if (type is ConeClassLikeType) { if (type is ConeClassLikeType) {
@@ -23,12 +17,12 @@ fun ConeTypeProjection.createArrayOf(session: FirSession, nullable: Boolean = fa
val primitiveArrayId = val primitiveArrayId =
StandardClassIds.primitiveArrayTypeByElementType[classId] ?: StandardClassIds.unsignedArrayTypeByElementType[classId] StandardClassIds.primitiveArrayTypeByElementType[classId] ?: StandardClassIds.unsignedArrayTypeByElementType[classId]
if (primitiveArrayId != null) { if (primitiveArrayId != null) {
return primitiveArrayId.invoke(symbolProvider).constructType(emptyArray(), nullable) return primitiveArrayId.constructClassLikeType(emptyArray(), nullable)
} }
} }
} }
return StandardClassIds.Array.invoke(symbolProvider).constructType(arrayOf(this), nullable) return StandardClassIds.Array.constructClassLikeType(arrayOf(this), nullable)
} }
@@ -40,7 +34,7 @@ fun ConeKotlinType.arrayElementType(session: FirSession): ConeKotlinType? {
return (type.typeArguments.first() as ConeKotlinTypeProjection).type return (type.typeArguments.first() as ConeKotlinTypeProjection).type
val elementType = StandardClassIds.elementTypeByPrimitiveArrayType[classId] ?: StandardClassIds.elementTypeByUnsignedArrayType[classId] val elementType = StandardClassIds.elementTypeByPrimitiveArrayType[classId] ?: StandardClassIds.elementTypeByUnsignedArrayType[classId]
if (elementType != null) { if (elementType != null) {
return elementType.invoke(session.firSymbolProvider).constructType(emptyArray(), isNullable = false) return elementType.constructClassLikeType(emptyArray(), isNullable = false)
} }
return null return null
@@ -9,8 +9,10 @@ import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTag import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTag
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
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.name.ClassId
import org.jetbrains.kotlin.resolve.calls.NewCommonSuperTypeCalculator import org.jetbrains.kotlin.resolve.calls.NewCommonSuperTypeCalculator
import org.jetbrains.kotlin.types.AbstractNullabilityChecker import org.jetbrains.kotlin.types.AbstractNullabilityChecker
import org.jetbrains.kotlin.types.AbstractStrictEqualityTypeChecker import org.jetbrains.kotlin.types.AbstractStrictEqualityTypeChecker
@@ -189,6 +191,13 @@ fun ConeClassLikeLookupTag.constructClassType(
return ConeClassLikeTypeImpl(this, typeArguments, isNullable) return ConeClassLikeTypeImpl(this, typeArguments, isNullable)
} }
fun ClassId.constructClassLikeType(
typeArguments: Array<out ConeTypeProjection>,
isNullable: Boolean,
): ConeClassLikeType {
return ConeClassLikeTypeImpl(ConeClassLikeLookupTagImpl(this), typeArguments, isNullable)
}
fun ConeClassifierLookupTag.constructType(typeArguments: Array<out ConeTypeProjection>, isNullable: Boolean): ConeLookupTagBasedType { fun ConeClassifierLookupTag.constructType(typeArguments: Array<out ConeTypeProjection>, isNullable: Boolean): ConeLookupTagBasedType {
return when (this) { return when (this) {
is ConeTypeParameterLookupTag -> ConeTypeParameterTypeImpl(this, isNullable) is ConeTypeParameterLookupTag -> ConeTypeParameterTypeImpl(this, isNullable)