JVM IR: script is a valid container for local delegated properties
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
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
// 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
|
||||
Reference in New Issue
Block a user