diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/TransformUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/TransformUtils.kt index e81ded96685..dcdcf775d1f 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/TransformUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/TransformUtils.kt @@ -7,17 +7,13 @@ package org.jetbrains.kotlin.fir.resolve.transformers import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.declarations.FirValueParameter -import org.jetbrains.kotlin.fir.expressions.FirExpression -import org.jetbrains.kotlin.fir.expressions.FirFunctionCall -import org.jetbrains.kotlin.fir.expressions.FirStatement -import org.jetbrains.kotlin.fir.expressions.FirWrappedArgumentExpression +import org.jetbrains.kotlin.fir.expressions.* +import org.jetbrains.kotlin.fir.expressions.impl.FirBlockImpl +import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock import org.jetbrains.kotlin.fir.references.* import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType import org.jetbrains.kotlin.fir.types.* -import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult -import org.jetbrains.kotlin.fir.visitors.FirDefaultTransformer -import org.jetbrains.kotlin.fir.visitors.FirTransformer -import org.jetbrains.kotlin.fir.visitors.compose +import org.jetbrains.kotlin.fir.visitors.* internal object MapArguments : FirDefaultTransformer>() { override fun transformElement(element: E, data: Map): CompositeTransformResult { @@ -37,6 +33,27 @@ internal object MapArguments : FirDefaultTransformer ): CompositeTransformResult { return (wrappedArgumentExpression.transformChildren(this, data) as FirStatement).compose() } + + override fun transformBlock(block: FirBlock, data: Map): CompositeTransformResult { + if (block.statements.isEmpty()) return block.compose() + val transformedStatement = block.statements.last().transformSingle(this@MapArguments, data) + when (block) { + is FirBlockImpl -> block.statements[block.statements.size - 1] = transformedStatement + is FirSingleExpressionBlock -> block.statement = transformedStatement + } + return block.compose() + } + + override fun transformCatch(catch: FirCatch, data: Map): CompositeTransformResult { + return catch.transformBlock(this, data).compose() + } + + override fun transformWhenBranch( + whenBranch: FirWhenBranch, + data: Map, + ): CompositeTransformResult { + return whenBranch.transformResult(this, data).compose() + } } internal object StoreType : FirDefaultTransformer() { diff --git a/compiler/fir/resolve/testData/resolve/problems/covariantArrayAsReceiver.txt b/compiler/fir/resolve/testData/resolve/problems/covariantArrayAsReceiver.txt index 2a31b8a545a..f83b16ae962 100644 --- a/compiler/fir/resolve/testData/resolve/problems/covariantArrayAsReceiver.txt +++ b/compiler/fir/resolve/testData/resolve/problems/covariantArrayAsReceiver.txt @@ -19,7 +19,7 @@ FILE: covariantArrayAsReceiver.kt public final fun foo(element: R|PsiElement|, usages: R|kotlin/Array|): R|kotlin/Unit| { lval adjusted: R|kotlin/collections/List?| = when () { (R|/element| is R|KtParameter|) -> { - R|/usages|.R|/filterNot|( = filterNot@fun .(): { + R|/usages|.R|/filterNot|( = filterNot@fun (it: R|UsageInfo|): R|kotlin/Boolean| { (R|/it|.R|/UsageInfo.usage| is R|KtLightMethod|) } ) diff --git a/compiler/fir/resolve/testData/resolve/stdlib/smartcasts/tryWithLambdaInside.dot b/compiler/fir/resolve/testData/resolve/stdlib/smartcasts/tryWithLambdaInside.dot index 28ed241d7d6..12069603132 100644 --- a/compiler/fir/resolve/testData/resolve/stdlib/smartcasts/tryWithLambdaInside.dot +++ b/compiler/fir/resolve/testData/resolve/stdlib/smartcasts/tryWithLambdaInside.dot @@ -47,7 +47,7 @@ digraph tryWithLambdaInside_kt { 15 [label="Exit function anonymousFunction"]; } 16 [label="Postponed exit from lambda"]; - 17 [label="Function call: R|/list|.R|kotlin/collections/filter|( = filter@fun .(): { + 17 [label="Function call: R|/list|.R|kotlin/collections/filter|( = filter@fun (it: R|kotlin/Boolean|): R|kotlin/Boolean| { R|/it| } )"]; @@ -68,7 +68,7 @@ digraph tryWithLambdaInside_kt { 24 [label="Try expression exit"]; } 25 [label="Jump: ^testInPlace try { - R|/list|.R|kotlin/collections/filter|( = filter@fun .(): { + R|/list|.R|kotlin/collections/filter|( = filter@fun (it: R|kotlin/Boolean|): R|kotlin/Boolean| { R|/it| } ) @@ -119,7 +119,7 @@ finally { 32 [label="Access variable R|/list|"]; 33 [label="Postponed enter to lambda"]; 34 [label="Postponed exit from lambda"]; - 35 [label="Function call: R|/list|.R|/notInPlaceFilter|( = notInPlaceFilter@fun .(): { + 35 [label="Function call: R|/list|.R|/notInPlaceFilter|( = notInPlaceFilter@fun (it: R|kotlin/Boolean|): R|kotlin/Boolean| { R|/it| } )"]; @@ -140,7 +140,7 @@ finally { 42 [label="Try expression exit"]; } 43 [label="Jump: ^testNotInPlace try { - R|/list|.R|/notInPlaceFilter|( = notInPlaceFilter@fun .(): { + R|/list|.R|/notInPlaceFilter|( = notInPlaceFilter@fun (it: R|kotlin/Boolean|): R|kotlin/Boolean| { R|/it| } ) @@ -171,4 +171,14 @@ finally { 43 -> {44} [style=dotted]; 44 -> {45} [style=dotted]; + subgraph cluster_15 { + color=red + 46 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + 47 [label="Access variable R|/it|"]; + 48 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + + 46 -> {47}; + 47 -> {48}; + } diff --git a/compiler/fir/resolve/testData/resolve/stdlib/smartcasts/tryWithLambdaInside.txt b/compiler/fir/resolve/testData/resolve/stdlib/smartcasts/tryWithLambdaInside.txt index e5c53e22b9d..e0de243fb68 100644 --- a/compiler/fir/resolve/testData/resolve/stdlib/smartcasts/tryWithLambdaInside.txt +++ b/compiler/fir/resolve/testData/resolve/stdlib/smartcasts/tryWithLambdaInside.txt @@ -6,7 +6,7 @@ FILE: tryWithLambdaInside.kt } public final fun testInPlace(list: R|kotlin/collections/List|): R|kotlin/collections/List| { ^testInPlace try { - R|/list|.R|kotlin/collections/filter|( = filter@fun .(): { + R|/list|.R|kotlin/collections/filter|( = filter@fun (it: R|kotlin/Boolean|): R|kotlin/Boolean| { R|/it| } ) @@ -17,7 +17,7 @@ FILE: tryWithLambdaInside.kt } public final fun testNotInPlace(list: R|kotlin/collections/List|): R|kotlin/collections/List| { ^testNotInPlace try { - R|/list|.R|/notInPlaceFilter|( = notInPlaceFilter@fun .(): { + R|/list|.R|/notInPlaceFilter|( = notInPlaceFilter@fun (it: R|kotlin/Boolean|): R|kotlin/Boolean| { R|/it| } )