JVM_IR: move FunctionReference lowering before PropertyReference
so that `$$delegatedProperties` are generated in the lambdas' classes.
This commit is contained in:
@@ -96,7 +96,7 @@ class JvmBackendContext(
|
||||
|
||||
internal val classCodegens = mutableMapOf<IrClass, ClassCodegen>()
|
||||
|
||||
val localDelegatedProperties = mutableMapOf<IrClass, List<IrLocalDelegatedPropertySymbol>>()
|
||||
val localDelegatedProperties = mutableMapOf<IrAttributeContainer, List<IrLocalDelegatedPropertySymbol>>()
|
||||
|
||||
internal val multifileFacadesToAdd = mutableMapOf<JvmClassName, MutableList<IrClass>>()
|
||||
val multifileFacadeForPart = mutableMapOf<IrClass, JvmClassName>()
|
||||
|
||||
@@ -289,6 +289,7 @@ private val jvmFilePhases = listOf(
|
||||
|
||||
moveOrCopyCompanionObjectFieldsPhase,
|
||||
inlineCallableReferenceToLambdaPhase,
|
||||
functionReferencePhase,
|
||||
propertyReferencePhase,
|
||||
constPhase,
|
||||
propertiesPhase,
|
||||
@@ -310,7 +311,6 @@ private val jvmFilePhases = listOf(
|
||||
enumWhenPhase,
|
||||
singletonReferencesPhase,
|
||||
|
||||
functionReferencePhase,
|
||||
singleAbstractMethodPhase,
|
||||
assertionPhase,
|
||||
returnableBlocksPhase,
|
||||
|
||||
+1
-1
@@ -37,7 +37,7 @@ class DescriptorMetadataSerializer(
|
||||
}
|
||||
|
||||
override fun serialize(metadata: MetadataSource): Pair<MessageLite, JvmStringTable>? {
|
||||
val localDelegatedProperties = (irClass.attributeOwnerId as? IrClass)?.let(context.localDelegatedProperties::get)
|
||||
val localDelegatedProperties = context.localDelegatedProperties[irClass.attributeOwnerId]
|
||||
if (localDelegatedProperties != null && localDelegatedProperties.isNotEmpty()) {
|
||||
context.state.bindingTrace.record(
|
||||
CodegenBinding.DELEGATED_PROPERTIES_WITH_METADATA,
|
||||
|
||||
+5
-2
@@ -475,8 +475,11 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext)
|
||||
0,
|
||||
//don't pass receivers otherwise LocalDeclarationLowering will create additional captured parameters
|
||||
IrFunctionReferenceImpl(
|
||||
UNDEFINED_OFFSET, UNDEFINED_OFFSET, irFunctionReference.type, target, 0, irFunctionReference.reflectionTarget, null
|
||||
)
|
||||
UNDEFINED_OFFSET, UNDEFINED_OFFSET, irFunctionReference.type, target,
|
||||
irFunctionReference.typeArgumentsCount, irFunctionReference.reflectionTarget, null
|
||||
).apply {
|
||||
copyTypeArgumentsFrom(irFunctionReference)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+5
-2
@@ -48,7 +48,10 @@ import org.jetbrains.kotlin.types.Variance
|
||||
internal val propertyReferencePhase = makeIrFilePhase(
|
||||
::PropertyReferenceLowering,
|
||||
name = "PropertyReference",
|
||||
description = "Construct KProperty instances returned by expressions such as A::x and A()::x"
|
||||
description = "Construct KProperty instances returned by expressions such as A::x and A()::x",
|
||||
// This must be done after contents of functions are extracted into separate classes, or else the `$$delegatedProperties`
|
||||
// field will end up in the wrong class (not the one that declares the delegated property).
|
||||
prerequisite = setOf(functionReferencePhase)
|
||||
)
|
||||
|
||||
internal class PropertyReferenceLowering(val context: JvmBackendContext) : ClassLoweringPass {
|
||||
@@ -413,7 +416,7 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : Class
|
||||
}
|
||||
})
|
||||
|
||||
context.localDelegatedProperties[irClass.attributeOwnerId as IrClass] =
|
||||
context.localDelegatedProperties[irClass.attributeOwnerId] =
|
||||
kProperties.keys.filterIsInstance<IrLocalDelegatedPropertySymbol>()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user