From 286622009d69acf2a41e42f0ed06ca3797d4da9a Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 5 Feb 2020 15:30:00 +0300 Subject: [PATCH] FIR: Cleanup PostponedArguments.kt --- .../fir/resolve/calls/PostponedArguments.kt | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/PostponedArguments.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/PostponedArguments.kt index 13c2c9b15d8..b0e6eee9da9 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/PostponedArguments.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/PostponedArguments.kt @@ -34,7 +34,7 @@ fun Candidate.preprocessLambdaArgument( val resolvedArgument = extractLambdaInfoFromFunctionalType(expectedType, expectedTypeRef, argument, bodyResolveComponents.session) - ?: extraLambdaInfo(expectedType, expectedTypeRef, argument, csBuilder, bodyResolveComponents.session) + ?: extraLambdaInfo(expectedType, argument, csBuilder, bodyResolveComponents.session) if (expectedType != null) { // TODO: add SAM conversion processing @@ -88,7 +88,7 @@ fun ConeKotlinType.returnType(session: FirSession): ConeKotlinType? { return (projection as? ConeTypedProjection)?.type } -private fun ConeKotlinType.valueParameterTypes(session: FirSession): List { +private fun ConeKotlinType.valueParameterTypesIncludingReceiver(session: FirSession): List { require(this is ConeClassLikeType) return fullyExpandedType(session).typeArguments.dropLast(1).map { (it as? ConeTypedProjection)?.type @@ -101,32 +101,28 @@ private val FirAnonymousFunction.receiverType get() = receiverTypeRef?.coneTypeS private fun extraLambdaInfo( expectedType: ConeKotlinType?, - expectedTypeRef: FirTypeRef, argument: FirAnonymousFunction, csBuilder: ConstraintSystemBuilder, session: FirSession ): ResolvedLambdaAtom { -// val builtIns = csBuilder.builtIns val isSuspend = expectedType?.isSuspendFunctionType(session) ?: false val isFunctionSupertype = expectedType != null && expectedType.lowerBoundIfFlexible() .isBuiltinFunctionalType(session)//isNotNullOrNullableFunctionSupertype(expectedType) - val argumentAsFunctionExpression = argument//.safeAs() val typeVariable = TypeVariableForLambdaReturnType(argument, "_L") - val receiverType = argumentAsFunctionExpression?.receiverType + val receiverType = argument.receiverType val returnType = - argumentAsFunctionExpression?.returnType + argument.returnType ?: expectedType?.typeArguments?.singleOrNull()?.safeAs()?.type?.takeIf { isFunctionSupertype } ?: typeVariable.defaultType - val nothingType = argument.session.builtinTypes.nothingType - .type //StandardClassIds.Nothing(argument.session.firSymbolProvider).constructType(emptyArray(), false) - val parameters = argument.valueParameters?.map { + val nothingType = argument.session.builtinTypes.nothingType.type + val parameters = argument.valueParameters.map { it.returnTypeRef.coneTypeSafe() ?: nothingType - } ?: emptyList() + } val newTypeVariableUsed = returnType == typeVariable.defaultType if (newTypeVariableUsed) csBuilder.registerVariable(typeVariable) @@ -146,9 +142,8 @@ internal fun extractLambdaInfoFromFunctionalType( } if (!expectedType.isBuiltinFunctionalType(session)) return null - val argumentAsFunctionExpression = argument//.safeAs() - val receiverType = argumentAsFunctionExpression.receiverType ?: expectedType.receiverType(expectedTypeRef, session) - val returnType = argumentAsFunctionExpression.returnType ?: expectedType.returnType(session) ?: return null + val receiverType = argument.receiverType ?: expectedType.receiverType(expectedTypeRef, session) + val returnType = argument.returnType ?: expectedType.returnType(session) ?: return null val parameters = extractLambdaParameters(expectedType, argument, expectedTypeRef.isExtensionFunctionType(session), session) return ResolvedLambdaAtom( @@ -177,7 +172,6 @@ private fun extractLambdaParameters( return parameters.mapIndexed { index, parameter -> parameter.returnTypeRef.coneTypeSafe() ?: expectedParameters.getOrNull(index) ?: nullableAnyType - //expectedType.builtIns.nullableAnyType } } @@ -185,7 +179,7 @@ private fun ConeKotlinType.extractParametersForFunctionalType( isExtensionFunctionType: Boolean, session: FirSession ): List { - return valueParameterTypes(session).let { + return valueParameterTypesIncludingReceiver(session).let { if (isExtensionFunctionType) { it.drop(1) } else { @@ -285,19 +279,17 @@ private fun extractInputOutputTypesFromFunctionType( functionType: ConeKotlinType, session: FirSession ): InputOutputTypes { - val receiver = null// TODO: functionType.receiverType() - val parameters = functionType.valueParameterTypes(session).map { + val parameters = functionType.valueParameterTypesIncludingReceiver(session).map { it ?: ConeClassLikeTypeImpl( ConeClassLikeLookupTagImpl(StandardClassIds.Nothing), emptyArray(), isNullable = false ) } - val inputTypes = /*listOfNotNull(receiver) +*/ parameters val outputType = functionType.returnType(session) ?: ConeClassLikeTypeImpl( ConeClassLikeLookupTagImpl(StandardClassIds.Any), emptyArray(), isNullable = true ) - return InputOutputTypes(inputTypes, outputType) + return InputOutputTypes(parameters, outputType) }