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 e4cf8846006..f7f08c3c635 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 @@ -310,11 +310,9 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer) override fun transformRegularClass(regularClass: FirRegularClass, data: ResolutionMode): CompositeTransformResult { if (regularClass.symbol.classId.isLocal && regularClass !in context.targetedLocalClasses) { - return FirImplicitTypeBodyResolveTransformerAdapterForLocalClasses( - components, data - ).transformRegularClass(regularClass, null).also { - context.storeClass(regularClass) - } + return regularClass.runAllPhasesForLocalClass(components, data).also { + context.storeClass(it) + }.compose() } context.storeClass(regularClass) @@ -351,9 +349,7 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer) data: ResolutionMode ): CompositeTransformResult { if (anonymousObject !in context.targetedLocalClasses) { - return FirImplicitTypeBodyResolveTransformerAdapterForLocalClasses( - components, data - ).transformAnonymousObject(anonymousObject, null) + return anonymousObject.runAllPhasesForLocalClass(components, data).compose() } prepareLocalClassForBodyResolve(anonymousObject) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt index 5824d2945d6..105e8f9154a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt @@ -13,7 +13,6 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind -import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.ResolutionMode import org.jetbrains.kotlin.fir.resolve.ScopeSession @@ -52,51 +51,38 @@ class FirImplicitTypeBodyResolveTransformerAdapter(private val scopeSession: Sco } } -class FirImplicitTypeBodyResolveTransformerAdapterForLocalClasses( - private val components: FirAbstractBodyResolveTransformer.BodyResolveTransformerComponents, - private val resolutionMode: ResolutionMode, -) : FirTransformer() { - override fun transformElement(element: E, data: Nothing?): CompositeTransformResult { - return element.compose() +fun > F.runBodiesResolutionForLocalClass( + components: FirAbstractBodyResolveTransformer.BodyResolveTransformerComponents, + resolutionMode: ResolutionMode, + localClassesNavigationInfo: LocalClassesNavigationInfo, +): F { + val (designationMap, targetedClasses) = localClassesNavigationInfo.run { + designationMap to parentForClass.keys + this@runBodiesResolutionForLocalClass } - override fun transformRegularClass(regularClass: FirRegularClass, data: Nothing?): CompositeTransformResult { - return transformClass(regularClass, data) - } + val implicitBodyResolveComputationSession = + ((components.returnTypeCalculator as? ReturnTypeCalculatorWithJump)?.implicitBodyResolveComputationSession + ?: ImplicitBodyResolveComputationSession()) + val returnTypeCalculator = ReturnTypeCalculatorWithJump( + components.session, + components.scopeSession, + implicitBodyResolveComputationSession, + designationMap, + ) - override fun transformAnonymousObject(anonymousObject: FirAnonymousObject, data: Nothing?): CompositeTransformResult { - return transformClass(anonymousObject, data) - } + val newContext = components.context.createSnapshotForLocalClasses(returnTypeCalculator, targetedClasses) + returnTypeCalculator.outerBodyResolveContext = newContext - override fun > transformClass(klass: FirClass, data: Nothing?): CompositeTransformResult { - val (designationMap, targetedClasses) = klass.collectLocalClassesNavigationInfo().run { - designationMap to parentForClass.keys + klass - } + val transformer = FirImplicitAwareBodyResolveTransformer( + components.session, components.scopeSession, + implicitBodyResolveComputationSession, + FirResolvePhase.BODY_RESOLVE, + outerBodyResolveContext = newContext, + implicitTypeOnly = false, + returnTypeCalculator + ) - val implicitBodyResolveComputationSession = - ((components.returnTypeCalculator as? ReturnTypeCalculatorWithJump)?.implicitBodyResolveComputationSession - ?: ImplicitBodyResolveComputationSession()) - val returnTypeCalculator = ReturnTypeCalculatorWithJump( - components.session, - components.scopeSession, - implicitBodyResolveComputationSession, - designationMap, - ) - - val newContext = components.context.createSnapshotForLocalClasses(returnTypeCalculator, targetedClasses) - returnTypeCalculator.outerBodyResolveContext = newContext - - val transformer = FirImplicitAwareBodyResolveTransformer( - components.session, components.scopeSession, - implicitBodyResolveComputationSession, - FirResolvePhase.BODY_RESOLVE, - outerBodyResolveContext = newContext, - implicitTypeOnly = false, - returnTypeCalculator - ) - - return klass.transform(transformer, resolutionMode) - } + return this.transform(transformer, resolutionMode).single } fun createReturnTypeCalculatorForIDE(session: FirSession, scopeSession: ScopeSession): ReturnTypeCalculator = diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/LocalClassesResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/LocalClassesResolution.kt new file mode 100644 index 00000000000..7885d4ac48e --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/LocalClassesResolution.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve + +import org.jetbrains.kotlin.fir.declarations.FirClass +import org.jetbrains.kotlin.fir.resolve.ResolutionMode + +fun > F.runAllPhasesForLocalClass( + components: FirAbstractBodyResolveTransformer.BodyResolveTransformerComponents, + resolutionMode: ResolutionMode +): F { + val localClassesNavigationInfo = collectLocalClassesNavigationInfo() + runBodiesResolutionForLocalClass(components, resolutionMode, localClassesNavigationInfo) + return this +}