Remove descriptors from SharedVariablesManager

This commit is contained in:
Georgy Bronnikov
2019-03-12 16:44:36 +03:00
parent edc766af56
commit d7ce24410d
3 changed files with 196 additions and 239 deletions
@@ -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
}
}