[Analysis API] KTIJ-24527 Properly handle typealiased functional types

Use expanded ConeTypes to get correct parameters and return types

Also, fix the order of rendering modifiers in `KtFunctionalTypeRenderer`

^KTIJ-24527 Fixed
This commit is contained in:
Roman Golyshev
2023-02-08 21:41:28 +01:00
committed by teamcity
parent b931868d41
commit ac8d5a0ea8
9 changed files with 105 additions and 31 deletions
@@ -229,6 +229,14 @@ fun ConeKotlinType.findContributedInvokeSymbol(
// ---------------------------------------------- function type type argument extraction ----------------------------------------------
fun ConeKotlinType.contextReceiversTypes(session: FirSession): List<ConeKotlinType> {
if (!isSomeFunctionType(session)) return emptyList()
return fullyExpandedType(session).let { expanded ->
val contextReceivers = expanded.typeArguments.take(expanded.contextReceiversNumberForFunctionType)
contextReceivers.map { it.typeOrDefault(session.builtinTypes.nothingType.type) }
}
}
fun ConeKotlinType.receiverType(session: FirSession): ConeKotlinType? {
if (!isSomeFunctionType(session) || !isExtensionFunctionType(session)) return null
return fullyExpandedType(session).let { expanded ->
@@ -242,6 +250,17 @@ fun ConeKotlinType.returnType(session: FirSession): ConeKotlinType {
return fullyExpandedType(session).typeArguments.last().typeOrDefault(session.builtinTypes.nullableAnyType.type)
}
fun ConeKotlinType.valueParameterTypesWithoutReceivers(session: FirSession): List<ConeKotlinType> {
require(this is ConeClassLikeType)
// TODO: add requirement
val expandedType = fullyExpandedType(session)
val receiversNumber = expandedType.contextReceiversNumberForFunctionType + if (expandedType.isExtensionFunctionType) 1 else 0
val valueParameters = expandedType.typeArguments.drop(receiversNumber).dropLast(1)
return valueParameters.map { it.typeOrDefault(session.builtinTypes.nothingType.type) }
}
fun ConeKotlinType.valueParameterTypesIncludingReceiver(session: FirSession): List<ConeKotlinType> {
require(this is ConeClassLikeType)
// TODO: add requirement