FIR: Cleanup PostponedArguments.kt
This commit is contained in:
+12
-20
@@ -34,7 +34,7 @@ fun Candidate.preprocessLambdaArgument(
|
|||||||
|
|
||||||
val resolvedArgument =
|
val resolvedArgument =
|
||||||
extractLambdaInfoFromFunctionalType(expectedType, expectedTypeRef, argument, bodyResolveComponents.session)
|
extractLambdaInfoFromFunctionalType(expectedType, expectedTypeRef, argument, bodyResolveComponents.session)
|
||||||
?: extraLambdaInfo(expectedType, expectedTypeRef, argument, csBuilder, bodyResolveComponents.session)
|
?: extraLambdaInfo(expectedType, argument, csBuilder, bodyResolveComponents.session)
|
||||||
|
|
||||||
if (expectedType != null) {
|
if (expectedType != null) {
|
||||||
// TODO: add SAM conversion processing
|
// TODO: add SAM conversion processing
|
||||||
@@ -88,7 +88,7 @@ fun ConeKotlinType.returnType(session: FirSession): ConeKotlinType? {
|
|||||||
return (projection as? ConeTypedProjection)?.type
|
return (projection as? ConeTypedProjection)?.type
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun ConeKotlinType.valueParameterTypes(session: FirSession): List<ConeKotlinType?> {
|
private fun ConeKotlinType.valueParameterTypesIncludingReceiver(session: FirSession): List<ConeKotlinType?> {
|
||||||
require(this is ConeClassLikeType)
|
require(this is ConeClassLikeType)
|
||||||
return fullyExpandedType(session).typeArguments.dropLast(1).map {
|
return fullyExpandedType(session).typeArguments.dropLast(1).map {
|
||||||
(it as? ConeTypedProjection)?.type
|
(it as? ConeTypedProjection)?.type
|
||||||
@@ -101,32 +101,28 @@ private val FirAnonymousFunction.receiverType get() = receiverTypeRef?.coneTypeS
|
|||||||
|
|
||||||
private fun extraLambdaInfo(
|
private fun extraLambdaInfo(
|
||||||
expectedType: ConeKotlinType?,
|
expectedType: ConeKotlinType?,
|
||||||
expectedTypeRef: FirTypeRef,
|
|
||||||
argument: FirAnonymousFunction,
|
argument: FirAnonymousFunction,
|
||||||
csBuilder: ConstraintSystemBuilder,
|
csBuilder: ConstraintSystemBuilder,
|
||||||
session: FirSession
|
session: FirSession
|
||||||
): ResolvedLambdaAtom {
|
): ResolvedLambdaAtom {
|
||||||
// val builtIns = csBuilder.builtIns
|
|
||||||
val isSuspend = expectedType?.isSuspendFunctionType(session) ?: false
|
val isSuspend = expectedType?.isSuspendFunctionType(session) ?: false
|
||||||
|
|
||||||
val isFunctionSupertype =
|
val isFunctionSupertype =
|
||||||
expectedType != null && expectedType.lowerBoundIfFlexible()
|
expectedType != null && expectedType.lowerBoundIfFlexible()
|
||||||
.isBuiltinFunctionalType(session)//isNotNullOrNullableFunctionSupertype(expectedType)
|
.isBuiltinFunctionalType(session)//isNotNullOrNullableFunctionSupertype(expectedType)
|
||||||
val argumentAsFunctionExpression = argument//.safeAs<FunctionExpression>()
|
|
||||||
|
|
||||||
val typeVariable = TypeVariableForLambdaReturnType(argument, "_L")
|
val typeVariable = TypeVariableForLambdaReturnType(argument, "_L")
|
||||||
|
|
||||||
val receiverType = argumentAsFunctionExpression?.receiverType
|
val receiverType = argument.receiverType
|
||||||
val returnType =
|
val returnType =
|
||||||
argumentAsFunctionExpression?.returnType
|
argument.returnType
|
||||||
?: expectedType?.typeArguments?.singleOrNull()?.safeAs<ConeTypedProjection>()?.type?.takeIf { isFunctionSupertype }
|
?: expectedType?.typeArguments?.singleOrNull()?.safeAs<ConeTypedProjection>()?.type?.takeIf { isFunctionSupertype }
|
||||||
?: typeVariable.defaultType
|
?: typeVariable.defaultType
|
||||||
|
|
||||||
val nothingType = argument.session.builtinTypes.nothingType
|
val nothingType = argument.session.builtinTypes.nothingType.type
|
||||||
.type //StandardClassIds.Nothing(argument.session.firSymbolProvider).constructType(emptyArray(), false)
|
val parameters = argument.valueParameters.map {
|
||||||
val parameters = argument.valueParameters?.map {
|
|
||||||
it.returnTypeRef.coneTypeSafe<ConeKotlinType>() ?: nothingType
|
it.returnTypeRef.coneTypeSafe<ConeKotlinType>() ?: nothingType
|
||||||
} ?: emptyList()
|
}
|
||||||
|
|
||||||
val newTypeVariableUsed = returnType == typeVariable.defaultType
|
val newTypeVariableUsed = returnType == typeVariable.defaultType
|
||||||
if (newTypeVariableUsed) csBuilder.registerVariable(typeVariable)
|
if (newTypeVariableUsed) csBuilder.registerVariable(typeVariable)
|
||||||
@@ -146,9 +142,8 @@ internal fun extractLambdaInfoFromFunctionalType(
|
|||||||
}
|
}
|
||||||
if (!expectedType.isBuiltinFunctionalType(session)) return null
|
if (!expectedType.isBuiltinFunctionalType(session)) return null
|
||||||
|
|
||||||
val argumentAsFunctionExpression = argument//.safeAs<FunctionExpression>()
|
val receiverType = argument.receiverType ?: expectedType.receiverType(expectedTypeRef, session)
|
||||||
val receiverType = argumentAsFunctionExpression.receiverType ?: expectedType.receiverType(expectedTypeRef, session)
|
val returnType = argument.returnType ?: expectedType.returnType(session) ?: return null
|
||||||
val returnType = argumentAsFunctionExpression.returnType ?: expectedType.returnType(session) ?: return null
|
|
||||||
val parameters = extractLambdaParameters(expectedType, argument, expectedTypeRef.isExtensionFunctionType(session), session)
|
val parameters = extractLambdaParameters(expectedType, argument, expectedTypeRef.isExtensionFunctionType(session), session)
|
||||||
|
|
||||||
return ResolvedLambdaAtom(
|
return ResolvedLambdaAtom(
|
||||||
@@ -177,7 +172,6 @@ private fun extractLambdaParameters(
|
|||||||
|
|
||||||
return parameters.mapIndexed { index, parameter ->
|
return parameters.mapIndexed { index, parameter ->
|
||||||
parameter.returnTypeRef.coneTypeSafe() ?: expectedParameters.getOrNull(index) ?: nullableAnyType
|
parameter.returnTypeRef.coneTypeSafe() ?: expectedParameters.getOrNull(index) ?: nullableAnyType
|
||||||
//expectedType.builtIns.nullableAnyType
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,7 +179,7 @@ private fun ConeKotlinType.extractParametersForFunctionalType(
|
|||||||
isExtensionFunctionType: Boolean,
|
isExtensionFunctionType: Boolean,
|
||||||
session: FirSession
|
session: FirSession
|
||||||
): List<ConeKotlinType?> {
|
): List<ConeKotlinType?> {
|
||||||
return valueParameterTypes(session).let {
|
return valueParameterTypesIncludingReceiver(session).let {
|
||||||
if (isExtensionFunctionType) {
|
if (isExtensionFunctionType) {
|
||||||
it.drop(1)
|
it.drop(1)
|
||||||
} else {
|
} else {
|
||||||
@@ -285,19 +279,17 @@ private fun extractInputOutputTypesFromFunctionType(
|
|||||||
functionType: ConeKotlinType,
|
functionType: ConeKotlinType,
|
||||||
session: FirSession
|
session: FirSession
|
||||||
): InputOutputTypes {
|
): InputOutputTypes {
|
||||||
val receiver = null// TODO: functionType.receiverType()
|
val parameters = functionType.valueParameterTypesIncludingReceiver(session).map {
|
||||||
val parameters = functionType.valueParameterTypes(session).map {
|
|
||||||
it ?: ConeClassLikeTypeImpl(
|
it ?: ConeClassLikeTypeImpl(
|
||||||
ConeClassLikeLookupTagImpl(StandardClassIds.Nothing), emptyArray(),
|
ConeClassLikeLookupTagImpl(StandardClassIds.Nothing), emptyArray(),
|
||||||
isNullable = false
|
isNullable = false
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
val inputTypes = /*listOfNotNull(receiver) +*/ parameters
|
|
||||||
val outputType = functionType.returnType(session) ?: ConeClassLikeTypeImpl(
|
val outputType = functionType.returnType(session) ?: ConeClassLikeTypeImpl(
|
||||||
ConeClassLikeLookupTagImpl(StandardClassIds.Any), emptyArray(),
|
ConeClassLikeLookupTagImpl(StandardClassIds.Any), emptyArray(),
|
||||||
isNullable = true
|
isNullable = true
|
||||||
)
|
)
|
||||||
|
|
||||||
return InputOutputTypes(inputTypes, outputType)
|
return InputOutputTypes(parameters, outputType)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user