diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt index 20361b65aa6..2b8efaf2a52 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt @@ -408,7 +408,6 @@ class BodyResolveContext( inline fun forConstructorBody( constructor: FirConstructor, - parametersScope: FirLocalScope?, crossinline f: () -> T ): T { return if (constructor.isPrimary) { @@ -418,12 +417,12 @@ class BodyResolveContext( * special towerDataContext */ withTowerDataMode(FirTowerDataMode.CONSTRUCTOR_HEADER) { - parametersScope?.let { addLocalScope(it) } + getPrimaryConstructorAllParametersScope()?.let { addLocalScope(it) } f() } } else { withTowerDataCleanup { - parametersScope?.let { addLocalScope(it) } + addLocalScope(buildSecondaryConstructorParametersScope(constructor)) f() } } @@ -616,17 +615,40 @@ class BodyResolveContext( } inline fun forDelegatedConstructor( - parametersScope: FirLocalScope?, + constructor: FirConstructor, + owningClass: FirRegularClass?, + holder: SessionHolder, crossinline f: () -> T ): T { - if (parametersScope == null) return f() - return withTowerDataCleanup { - addLocalScope(parametersScope) - f() + return withTowerDataMode(FirTowerDataMode.CONSTRUCTOR_HEADER) { + if (constructor.isPrimary) { + getPrimaryConstructorAllParametersScope()?.let { + withTowerDataCleanup { + addLocalScope(it) + f() + } + } ?: f() + } else { + if (owningClass != null) { + addReceiver( + null, + InaccessibleImplicitReceiverValue( + owningClass.symbol, + owningClass.defaultType(), + holder.session, + holder.scopeSession + ) + ) + } + withTowerDataCleanup { + addLocalScope(buildSecondaryConstructorParametersScope(constructor)) + constructor.valueParameters.forEach { storeVariable(it) } + f() + } + } } } - fun buildConstructorParametersScope(constructor: FirConstructor): FirLocalScope? = - if (constructor.isPrimary) getPrimaryConstructorAllParametersScope() - else constructor.valueParameters.fold(FirLocalScope()) { acc, param -> acc.storeVariable(param) } + fun buildSecondaryConstructorParametersScope(constructor: FirConstructor): FirLocalScope = + constructor.valueParameters.fold(FirLocalScope()) { acc, param -> acc.storeVariable(param) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt index fcdee01c2a5..8d9357c4059 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt @@ -552,11 +552,8 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor context.forConstructorParameters(constructor, owningClass, components) { constructor.transformValueParameters(transformer, data) } - val parametersScope = context.buildConstructorParametersScope(constructor) - context.forDelegatedConstructor(parametersScope) { - constructor.transformDelegatedConstructor(transformer, data) - } - context.forConstructorBody(constructor, parametersScope) { + constructor.transformDelegatedConstructor(transformer, data) + context.forConstructorBody(constructor) { constructor.transformBody(transformer, data) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index 01e42f6c8a5..eb2e2389f48 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -827,35 +827,10 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform var result = delegatedConstructorCall try { val lastDispatchReceiver = implicitReceiverStack.lastDispatchReceiver() - - // because there's a `context.saveContextForAnonymousFunction(anonymousFunction)` - // call inside of the FirDeclarationResolveTransformer and accessing `this` - // inside a lambda which is a value parameter of a constructor delegate - // is prohibited - context.withTowerDataMode(FirTowerDataMode.CONSTRUCTOR_HEADER) { - context.withTowerDataCleanup { - if ((context.containerIfAny as? FirConstructor)?.isPrimary == true) { - context.getPrimaryConstructorAllParametersScope()?.let(context::addLocalScope) - } - - // it's just a constructor parameters scope created in - // `FirDeclarationResolveTransformer::doTransformConstructor()` - context.towerDataContextsForClassParts.forMemberDeclaration.localScopes.lastOrNull()?.let(context::addLocalScope) - - if (containingClass is FirRegularClass && !containingConstructor.isPrimary) { - context.addReceiver( - null, - InaccessibleImplicitReceiverValue( - containingClass.symbol, - containingClass.defaultType(), - session, - scopeSession - ) - ) - } - delegatedConstructorCall.transformChildren(transformer, ResolutionMode.ContextDependent) - } + context.forDelegatedConstructor(containingConstructor, containingClass as? FirRegularClass, components) { + delegatedConstructorCall.transformChildren(transformer, ResolutionMode.ContextDependent) } + val reference = delegatedConstructorCall.calleeReference val constructorType: ConeClassLikeType = when (reference) { is FirThisReference -> {