[FIR] drop redundant receiver copy

^KT-54417
This commit is contained in:
Dmitrii Gridin
2022-11-02 14:35:02 +01:00
committed by Space Team
parent f67030f035
commit 3cd85a4622
6 changed files with 13 additions and 14 deletions
@@ -309,8 +309,8 @@ class FirCallCompleter(
lambdaArgument.replaceReceiverParameter(
lambdaArgument.receiverParameter?.let { receiverParameter ->
receiverType?.approximateLambdaInputType()?.let { approximatedType ->
buildReceiverParameterCopy(receiverParameter) {
type = receiverParameter.type.resolvedTypeFromPrototype(approximatedType)
receiverParameter.apply {
replaceType(type.resolvedTypeFromPrototype(approximatedType))
}
}
}
@@ -618,11 +618,7 @@ class FirCallCompletionResultsWriterTransformer(
val initialReceiverType = receiverParameter?.type?.coneTypeSafe<ConeKotlinType>()
val resultReceiverType = initialReceiverType?.let { finalSubstitutor.substituteOrNull(it) }
if (resultReceiverType != null) {
anonymousFunction.replaceReceiverParameter(
buildReceiverParameterCopy(receiverParameter) {
type = receiverParameter.type.resolvedTypeFromPrototype(resultReceiverType)
}
)
receiverParameter.replaceType(receiverParameter.type.resolvedTypeFromPrototype(resultReceiverType))
needUpdateLambdaType = true
}
@@ -813,15 +813,12 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
resolvedLambdaAtom != null -> obtainValueParametersFromResolvedLambdaAtom(resolvedLambdaAtom, lambda)
else -> lambda.valueParameters
}
val returnTypeRefFromResolvedAtom =
resolvedLambdaAtom?.returnType?.let { lambda.returnTypeRef.resolvedTypeFromPrototype(it) }
val returnTypeRefFromResolvedAtom = resolvedLambdaAtom?.returnType?.let { lambda.returnTypeRef.resolvedTypeFromPrototype(it) }
lambda = buildAnonymousFunctionCopy(lambda) {
receiverParameter = lambda.receiverParameter?.takeIf { it.type !is FirImplicitTypeRef }
?: resolvedLambdaAtom?.receiver?.let { coneKotlinType ->
lambda.receiverParameter?.let {
buildReceiverParameterCopy(it) {
type = it.type.resolvedTypeFromPrototype(coneKotlinType)
}
lambda.receiverParameter?.apply {
replaceType(type.resolvedTypeFromPrototype(coneKotlinType))
}
}
@@ -29,6 +29,8 @@ abstract class FirReceiverParameter : FirPureAbstractElement(), FirAnnotationCon
override fun <E: FirElement, D> transform(transformer: FirTransformer<D>, data: D): E =
transformer.transformReceiverParameter(this, data) as E
abstract fun replaceType(newType: FirTypeRef)
abstract fun <D> transformType(transformer: FirTransformer<D>, data: D): FirReceiverParameter
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirReceiverParameter
@@ -43,4 +43,8 @@ internal class FirReceiverParameterImpl(
annotations.transformInplace(transformer, data)
return this
}
override fun replaceType(newType: FirTypeRef) {
type = newType
}
}
@@ -394,7 +394,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
}
receiverParameter.configure {
+field("type", typeRef).withTransform()
+field("type", typeRef).withTransform().withReplace()
+annotations
}