[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.replaceReceiverParameter(
lambdaArgument.receiverParameter?.let { receiverParameter -> lambdaArgument.receiverParameter?.let { receiverParameter ->
receiverType?.approximateLambdaInputType()?.let { approximatedType -> receiverType?.approximateLambdaInputType()?.let { approximatedType ->
buildReceiverParameterCopy(receiverParameter) { receiverParameter.apply {
type = receiverParameter.type.resolvedTypeFromPrototype(approximatedType) replaceType(type.resolvedTypeFromPrototype(approximatedType))
} }
} }
} }
@@ -618,11 +618,7 @@ class FirCallCompletionResultsWriterTransformer(
val initialReceiverType = receiverParameter?.type?.coneTypeSafe<ConeKotlinType>() val initialReceiverType = receiverParameter?.type?.coneTypeSafe<ConeKotlinType>()
val resultReceiverType = initialReceiverType?.let { finalSubstitutor.substituteOrNull(it) } val resultReceiverType = initialReceiverType?.let { finalSubstitutor.substituteOrNull(it) }
if (resultReceiverType != null) { if (resultReceiverType != null) {
anonymousFunction.replaceReceiverParameter( receiverParameter.replaceType(receiverParameter.type.resolvedTypeFromPrototype(resultReceiverType))
buildReceiverParameterCopy(receiverParameter) {
type = receiverParameter.type.resolvedTypeFromPrototype(resultReceiverType)
}
)
needUpdateLambdaType = true needUpdateLambdaType = true
} }
@@ -813,15 +813,12 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
resolvedLambdaAtom != null -> obtainValueParametersFromResolvedLambdaAtom(resolvedLambdaAtom, lambda) resolvedLambdaAtom != null -> obtainValueParametersFromResolvedLambdaAtom(resolvedLambdaAtom, lambda)
else -> lambda.valueParameters else -> lambda.valueParameters
} }
val returnTypeRefFromResolvedAtom = val returnTypeRefFromResolvedAtom = resolvedLambdaAtom?.returnType?.let { lambda.returnTypeRef.resolvedTypeFromPrototype(it) }
resolvedLambdaAtom?.returnType?.let { lambda.returnTypeRef.resolvedTypeFromPrototype(it) }
lambda = buildAnonymousFunctionCopy(lambda) { lambda = buildAnonymousFunctionCopy(lambda) {
receiverParameter = lambda.receiverParameter?.takeIf { it.type !is FirImplicitTypeRef } receiverParameter = lambda.receiverParameter?.takeIf { it.type !is FirImplicitTypeRef }
?: resolvedLambdaAtom?.receiver?.let { coneKotlinType -> ?: resolvedLambdaAtom?.receiver?.let { coneKotlinType ->
lambda.receiverParameter?.let { lambda.receiverParameter?.apply {
buildReceiverParameterCopy(it) { replaceType(type.resolvedTypeFromPrototype(coneKotlinType))
type = it.type.resolvedTypeFromPrototype(coneKotlinType)
}
} }
} }
@@ -29,6 +29,8 @@ abstract class FirReceiverParameter : FirPureAbstractElement(), FirAnnotationCon
override fun <E: FirElement, D> transform(transformer: FirTransformer<D>, data: D): E = override fun <E: FirElement, D> transform(transformer: FirTransformer<D>, data: D): E =
transformer.transformReceiverParameter(this, data) as E transformer.transformReceiverParameter(this, data) as E
abstract fun replaceType(newType: FirTypeRef)
abstract fun <D> transformType(transformer: FirTransformer<D>, data: D): FirReceiverParameter abstract fun <D> transformType(transformer: FirTransformer<D>, data: D): FirReceiverParameter
abstract override fun <D> transformAnnotations(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) annotations.transformInplace(transformer, data)
return this return this
} }
override fun replaceType(newType: FirTypeRef) {
type = newType
}
} }
@@ -394,7 +394,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
} }
receiverParameter.configure { receiverParameter.configure {
+field("type", typeRef).withTransform() +field("type", typeRef).withTransform().withReplace()
+annotations +annotations
} }