From 748049daa376d6e1b0775e39023e9b34eaf4f740 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 15 Sep 2020 16:27:04 +0300 Subject: [PATCH] [FIR] Don't call inline lambda twice in `withFullBodyResolve` --- .../FirAbstractBodyResolveTransformer.kt | 10 ++++++--- .../FirDeclarationsResolveTransformer.kt | 21 ++++++++++--------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt index c51bb5fe29c..9b630ecfdc3 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt @@ -59,12 +59,16 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb @OptIn(PrivateForInline::class) internal inline fun withFullBodyResolve(crossinline l: () -> T): T { - if (!implicitTypeOnly) return l() - implicitTypeOnly = false + val shouldSwitchMode = implicitTypeOnly + if (shouldSwitchMode) { + implicitTypeOnly = false + } return try { l() } finally { - implicitTypeOnly = true + if (shouldSwitchMode) { + implicitTypeOnly = true + } } } 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 b4ebfb47a1b..6788a35c7ed 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 @@ -91,10 +91,9 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor } protected inline fun withTypeParametersOf(declaration: FirMemberDeclaration, crossinline l: () -> T): T { - val scope = createTypeParameterScope(declaration) ?: return l() - + val scope = createTypeParameterScope(declaration) return context.withTowerDataCleanup { - context.addNonLocalTowerDataElement(scope.asTowerDataElement(isLocal = false)) + scope?.let { context.addNonLocalTowerDataElement(it.asTowerDataElement(isLocal = false)) } l() } } @@ -111,14 +110,16 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor } return property.compose() } + + if (property.isLocal) { + prepareSignatureForBodyResolve(property) + property.transformStatus(this, property.resolveStatus(property.status).mode()) + property.getter?.let { it.transformStatus(this, it.resolveStatus(it.status).mode()) } + property.setter?.let { it.transformStatus(this, it.resolveStatus(it.status).mode()) } + return transformLocalVariable(property) + } + return withTypeParametersOf(property) { - if (property.isLocal) { - prepareSignatureForBodyResolve(property) - property.transformStatus(this, property.resolveStatus(property.status).mode()) - property.getter?.let { it.transformStatus(this, it.resolveStatus(it.status).mode()) } - property.setter?.let { it.transformStatus(this, it.resolveStatus(it.status).mode()) } - return@withTypeParametersOf transformLocalVariable(property) - } val returnTypeRef = property.returnTypeRef if (returnTypeRef !is FirImplicitTypeRef && implicitTypeOnly) return@withTypeParametersOf property.compose() if (property.resolvePhase == transformerPhase) return@withTypeParametersOf property.compose()