[FIR] Add util function for creating functional cone type
This commit is contained in:
@@ -199,17 +199,27 @@ fun FirFunction.constructFunctionalTypeRef(session: FirSession): FirResolvedType
|
|||||||
is FirAnonymousFunction -> receiverTypeRef
|
is FirAnonymousFunction -> receiverTypeRef
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
val receiverType = receiverTypeRef?.coneTypeUnsafe<ConeKotlinType>()
|
|
||||||
val parameters = valueParameters.map {
|
val parameters = valueParameters.map {
|
||||||
it.returnTypeRef.coneTypeSafe<ConeKotlinType>() ?: ConeKotlinErrorType("No type for parameter")
|
it.returnTypeRef.coneTypeSafe<ConeKotlinType>() ?: ConeKotlinErrorType("No type for parameter")
|
||||||
}
|
}
|
||||||
val rawReturnType = (this as FirTypedDeclaration).returnTypeRef.coneTypeUnsafe<ConeKotlinType>()
|
val rawReturnType = (this as FirTypedDeclaration).returnTypeRef.coneTypeUnsafe<ConeKotlinType>()
|
||||||
|
|
||||||
|
val functionalType = createFunctionalType(session, parameters, receiverTypeRef?.coneTypeUnsafe(), rawReturnType)
|
||||||
|
|
||||||
|
return FirResolvedTypeRefImpl(psi, functionalType)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun createFunctionalType(
|
||||||
|
session: FirSession,
|
||||||
|
parameters: List<ConeKotlinType>,
|
||||||
|
receiverType: ConeKotlinType?,
|
||||||
|
rawReturnType: ConeKotlinType
|
||||||
|
): ConeLookupTagBasedType {
|
||||||
val receiverAndParameterTypes = listOfNotNull(receiverType) + parameters + listOf(rawReturnType)
|
val receiverAndParameterTypes = listOfNotNull(receiverType) + parameters + listOf(rawReturnType)
|
||||||
|
|
||||||
val functionalTypeId = StandardClassIds.byName("Function${receiverAndParameterTypes.size - 1}")
|
val functionalTypeId = StandardClassIds.byName("Function${receiverAndParameterTypes.size - 1}")
|
||||||
val functionalType = functionalTypeId(session.service()).constructType(receiverAndParameterTypes.toTypedArray(), isNullable = false)
|
val functionalType = functionalTypeId(session.service()).constructType(receiverAndParameterTypes.toTypedArray(), isNullable = false)
|
||||||
|
return functionalType
|
||||||
return FirResolvedTypeRefImpl(psi, functionalType)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun BodyResolveComponents.typeForQualifier(resolvedQualifier: FirResolvedQualifier): FirTypeRef {
|
fun BodyResolveComponents.typeForQualifier(resolvedQualifier: FirResolvedQualifier): FirTypeRef {
|
||||||
|
|||||||
Reference in New Issue
Block a user