Remove descriptors from SharedVariablesManager
This commit is contained in:
+16
-64
@@ -12,8 +12,6 @@ import org.jetbrains.kotlin.backend.common.ir.copyTo
|
||||
import org.jetbrains.kotlin.backend.common.ir.copyTypeParametersFrom
|
||||
import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||
import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
@@ -41,7 +39,7 @@ val jvmLocalDeclarationsPhase = makeIrFilePhase(
|
||||
LocalDeclarationsLowering(context, object : LocalNameProvider {
|
||||
override fun localName(declaration: IrDeclarationWithName): String =
|
||||
NameUtils.sanitizeAsJavaIdentifier(super.localName(declaration))
|
||||
}, Visibilities.PUBLIC, true)
|
||||
}, Visibilities.PUBLIC)
|
||||
},
|
||||
name = "JvmLocalDeclarations",
|
||||
description = "Move local declarations to classes",
|
||||
@@ -68,13 +66,12 @@ object BOUND_VALUE_PARAMETER: IrDeclarationOriginImpl("BOUND_VALUE_PARAMETER")
|
||||
class LocalDeclarationsLowering(
|
||||
val context: BackendContext,
|
||||
val localNameProvider: LocalNameProvider = LocalNameProvider.DEFAULT,
|
||||
val loweredConstructorVisibility: Visibility = Visibilities.PRIVATE,
|
||||
private val isJVM: Boolean = false // TODO: remove this workaround
|
||||
val loweredConstructorVisibility: Visibility = Visibilities.PRIVATE
|
||||
) :
|
||||
DeclarationContainerLoweringPass {
|
||||
|
||||
private object DECLARATION_ORIGIN_FIELD_FOR_CAPTURED_VALUE :
|
||||
IrDeclarationOriginImpl("FIELD_FOR_CAPTURED_VALUE")
|
||||
IrDeclarationOriginImpl("FIELD_FOR_CAPTURED_VALUE", isSynthetic = true)
|
||||
|
||||
private object STATEMENT_ORIGIN_INITIALIZER_OF_FIELD_FOR_CAPTURED_VALUE :
|
||||
IrStatementOriginImpl("INITIALIZER_OF_FIELD_FOR_CAPTURED_VALUE")
|
||||
@@ -525,8 +522,7 @@ class LocalDeclarationsLowering(
|
||||
oldDeclaration.origin,
|
||||
newSymbol,
|
||||
newName,
|
||||
// TODO: change to PRIVATE when issue with CallableReferenceLowering in Jvm BE is fixed
|
||||
if (isJVM) Visibilities.PUBLIC else Visibilities.PRIVATE,
|
||||
Visibilities.PRIVATE,
|
||||
Modality.FINAL,
|
||||
oldDeclaration.returnType,
|
||||
oldDeclaration.isInline,
|
||||
@@ -619,11 +615,8 @@ class LocalDeclarationsLowering(
|
||||
newDeclaration.copyTypeParametersFrom(oldDeclaration)
|
||||
|
||||
// TODO: should dispatch receiver be copied?
|
||||
newDeclaration.dispatchReceiverParameter = oldDeclaration.dispatchReceiverParameter?.run {
|
||||
IrValueParameterImpl(startOffset, endOffset, origin, descriptor, type, varargElementType).also {
|
||||
it.parent = newDeclaration
|
||||
newParameterToOld.putAbsentOrSame(it, this)
|
||||
}
|
||||
newDeclaration.dispatchReceiverParameter = oldDeclaration.dispatchReceiverParameter?.copyTo(newDeclaration)?.also {
|
||||
newParameterToOld.putAbsentOrSame(it, oldDeclaration.dispatchReceiverParameter!!)
|
||||
}
|
||||
newDeclaration.extensionReceiverParameter = oldDeclaration.extensionReceiverParameter?.run {
|
||||
throw AssertionError("constructors can't have extension receiver")
|
||||
@@ -637,7 +630,7 @@ class LocalDeclarationsLowering(
|
||||
transformedDeclarations[oldDeclaration] = newDeclaration
|
||||
}
|
||||
|
||||
private fun createPropertyWithBackingField(
|
||||
private fun createFieldForCapturedValue(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
name: Name,
|
||||
@@ -669,57 +662,16 @@ class LocalDeclarationsLowering(
|
||||
|
||||
localClassContext.closure.capturedValues.forEach { capturedValue ->
|
||||
|
||||
if (isJVM) {
|
||||
val irField = createFieldForCapturedValue(
|
||||
classDeclaration.startOffset,
|
||||
classDeclaration.endOffset,
|
||||
suggestNameForCapturedValue(capturedValue.owner),
|
||||
Visibilities.PRIVATE,
|
||||
classDeclaration,
|
||||
capturedValue.owner.type
|
||||
)
|
||||
|
||||
// TODO: JVM Warkaround
|
||||
val classDescriptor = classDeclaration.descriptor
|
||||
val fieldDescriptor = PropertyDescriptorImpl.create(
|
||||
classDescriptor,
|
||||
Annotations.EMPTY,
|
||||
Modality.FINAL,
|
||||
Visibilities.PRIVATE,
|
||||
/* isVar = */ false,
|
||||
suggestNameForCapturedValue(capturedValue.owner),
|
||||
CallableMemberDescriptor.Kind.SYNTHESIZED,
|
||||
SourceElement.NO_SOURCE,
|
||||
/* lateInit = */ false,
|
||||
/* isConst = */ false,
|
||||
/* isExpect = */ false,
|
||||
/* isActual = */ false,
|
||||
/* isExternal = */ false,
|
||||
/* isDelegated = */ false
|
||||
)
|
||||
|
||||
fieldDescriptor.initialize(/* getter = */ null, /* setter = */ null)
|
||||
|
||||
val extensionReceiverParameter: ReceiverParameterDescriptor? = null
|
||||
|
||||
fieldDescriptor.setType(
|
||||
capturedValue.descriptor.type,
|
||||
emptyList<TypeParameterDescriptor>(),
|
||||
classDescriptor.thisAsReceiverParameter,
|
||||
extensionReceiverParameter
|
||||
)
|
||||
|
||||
localClassContext.capturedValueToField[capturedValue.owner] = IrFieldImpl(
|
||||
localClassContext.declaration.startOffset, localClassContext.declaration.endOffset,
|
||||
DECLARATION_ORIGIN_FIELD_FOR_CAPTURED_VALUE,
|
||||
fieldDescriptor, capturedValue.owner.type
|
||||
).apply {
|
||||
parent = localClassContext.declaration
|
||||
}
|
||||
} else {
|
||||
val irField = createPropertyWithBackingField(
|
||||
classDeclaration.startOffset,
|
||||
classDeclaration.endOffset,
|
||||
suggestNameForCapturedValue(capturedValue.owner),
|
||||
Visibilities.PRIVATE,
|
||||
classDeclaration,
|
||||
capturedValue.owner.type
|
||||
)
|
||||
|
||||
localClassContext.capturedValueToField[capturedValue.owner] = irField
|
||||
}
|
||||
localClassContext.capturedValueToField[capturedValue.owner] = irField
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user