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:
Alexander Udalov
2022-12-01 01:27:08 +01:00
parent fe81ad0bbe
commit 3ab2b82878
5 changed files with 37 additions and 7 deletions
@@ -90,6 +90,11 @@ public class ScriptCodegenTestGenerated extends AbstractScriptCodegenTest {
runTest("compiler/testData/codegen/script/localDelegatedProperty.kts");
}
@TestMetadata("localDelegatedPropertyInLambda.kts")
public void testLocalDelegatedPropertyInLambda() throws Exception {
runTest("compiler/testData/codegen/script/localDelegatedPropertyInLambda.kts");
}
@TestMetadata("localDelegatedPropertyNoExplicitType.kts")
public void testLocalDelegatedPropertyNoExplicitType() throws Exception {
runTest("compiler/testData/codegen/script/localDelegatedPropertyNoExplicitType.kts");