3ab2b82878
When serializing metadata for local delegated properties, we need to
find a valid container class where to put it, and where kotlin-reflect
will be able to find that metadata at runtime. Taking just the closest
class lexically doesn't work, because in the attached test, it is a
class for a lambda which does not have metadata and thus does not have a
way to store any extra information.
So, in 1663619606 we started to look for the closest "non-synthetic"
class to store this metadata. But apparently it was missed that script
is a valid container class. In the test, this meant that no
non-synthetic container classes were found to store the metadata, so we
falled back to using the closest class anyway (see `?: this` in
`rememberLocalProperty`), which turned out to be the lambda.
After this change, metadata for local delegated property in a lambda
will be stored in the script class, just like it's stored in the file
class in the non-script case.
#KT-55065 Fixed
18 lines
348 B
Kotlin
Vendored
18 lines
348 B
Kotlin
Vendored
// WITH_REFLECT
|
|
|
|
import kotlin.reflect.KProperty
|
|
|
|
class Delegate {
|
|
operator fun getValue(t: Any?, p: KProperty<*>): String =
|
|
if (p.returnType.toString() == "kotlin.String") "OK" else "Fail: ${p.returnType}"
|
|
}
|
|
|
|
fun f(lambda: () -> String): String = lambda()
|
|
|
|
val x = f {
|
|
val prop: String by Delegate()
|
|
prop
|
|
}
|
|
|
|
// expected: x: OK
|