RawFirBuilder: fix label bounding for property initialization

#KT-58076 Fixed
This commit is contained in:
Kirill Rakhman
2023-04-19 18:26:01 +02:00
committed by Space Team
parent df8132b844
commit 594b044c26
4 changed files with 27 additions and 5 deletions
@@ -13,8 +13,8 @@ FILE: lambdaWithAnonymousObject.kt
super<R|kotlin/Any|>() super<R|kotlin/Any|>()
} }
public open override val action: R|() -> kotlin/Unit| = myRun@fun <anonymous>(): R|kotlin/Unit| <inline=Unknown> { public open override val action: R|() -> kotlin/Unit| = fun <anonymous>(): R|kotlin/Unit| <inline=Unknown> {
^@myRun Unit ^ Unit
} }
public get(): R|() -> kotlin/Unit| public get(): R|() -> kotlin/Unit|
@@ -1186,7 +1186,11 @@ class DeclarationsConverter(
accessors += it accessors += it
} }
BACKING_FIELD -> fieldDeclaration = it BACKING_FIELD -> fieldDeclaration = it
else -> if (it.isExpression()) propertyInitializer = expressionConverter.getAsFirExpression(it, "Should have initializer") else -> if (it.isExpression()) {
context.calleeNamesForLambda += null
propertyInitializer = expressionConverter.getAsFirExpression(it, "Should have initializer")
context.calleeNamesForLambda.removeLast()
}
} }
} }
@@ -1722,9 +1722,14 @@ open class RawFirBuilder(
private fun KtDeclarationWithInitializer.toInitializerExpression() = private fun KtDeclarationWithInitializer.toInitializerExpression() =
runIf(hasInitializer()) { runIf(hasInitializer()) {
buildOrLazyExpression(null) { this@RawFirBuilder.context.calleeNamesForLambda += null
val expression = buildOrLazyExpression(null) {
initializer.toFirExpression("Should have initializer") initializer.toFirExpression("Should have initializer")
} }
this@RawFirBuilder.context.calleeNamesForLambda.removeLast()
expression
} }
private fun <T> KtProperty.toFirProperty( private fun <T> KtProperty.toFirProperty(
@@ -1,5 +1,6 @@
// FIR_IDENTICAL // FIR_IDENTICAL
// ISSUE: KT-57880 // ISSUE: KT-57880, KT-58076
// DIAGNOSTICS: -UNUSED_VARIABLE, -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE
fun outerLambda(action: String.() -> Unit) {} fun outerLambda(action: String.() -> Unit) {}
var lambda: Int.() -> Unit = {} var lambda: Int.() -> Unit = {}
@@ -18,4 +19,16 @@ fun main() {
consumeInt(this@innerLambda) consumeInt(this@innerLambda)
} }
} }
lateinit var c: Int.() -> Unit
val a = "hello".apply {
val b: Int.() -> Unit = {
this@apply.hello()
}
c = {
this@apply.hello()
}
}
} }
fun String.hello() = this