remove descriptors from createInnerClassConstructorWithOuterThisParameter

This commit is contained in:
Georgy Bronnikov
2019-01-09 18:56:09 +03:00
parent 72ea4cc3d7
commit f61072873f
2 changed files with 40 additions and 58 deletions
@@ -38,7 +38,7 @@ class JvmBackendContext(
irModuleFragment: IrModuleFragment, symbolTable: SymbolTable
) : CommonBackendContext {
override val builtIns = state.module.builtIns
override val declarationFactory: JvmDeclarationFactory = JvmDeclarationFactory(state, symbolTable)
override val declarationFactory: JvmDeclarationFactory = JvmDeclarationFactory(state)
override val sharedVariablesManager = JvmSharedVariablesManager(builtIns, irBuiltIns)
// TODO: inject a correct StorageManager instance, or store NotFoundClasses inside ModuleDescriptor
@@ -5,8 +5,14 @@
package org.jetbrains.kotlin.backend.jvm.descriptors
import org.jetbrains.kotlin.backend.common.deepCopyWithWrappedDescriptors
import org.jetbrains.kotlin.backend.common.descriptors.WrappedClassConstructorDescriptor
import org.jetbrains.kotlin.backend.common.descriptors.WrappedClassDescriptor
import org.jetbrains.kotlin.backend.common.descriptors.WrappedValueParameterDescriptor
import org.jetbrains.kotlin.backend.common.ir.DeclarationFactory
import org.jetbrains.kotlin.backend.common.ir.copyTo
import org.jetbrains.kotlin.backend.common.ir.copyTypeParametersFrom
import org.jetbrains.kotlin.backend.common.ir.createImplicitParameterDeclarationWithWrappedDescriptor
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
import org.jetbrains.kotlin.backend.jvm.lower.createStaticFunctionWithReceivers
import org.jetbrains.kotlin.builtins.CompanionObjectMapping.isMappedIntrinsicCompanionObject
@@ -14,7 +20,6 @@ import org.jetbrains.kotlin.codegen.OwnerKind
import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.declarations.*
@@ -27,7 +32,6 @@ import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.toIrType
import org.jetbrains.kotlin.ir.types.toKotlinType
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.load.java.JavaVisibilities
@@ -37,8 +41,7 @@ import org.jetbrains.org.objectweb.asm.Opcodes
import java.util.*
class JvmDeclarationFactory(
private val state: GenerationState,
private val symbolTable: SymbolTable
private val state: GenerationState
) : DeclarationFactory {
private val singletonFieldDeclarations = HashMap<IrSymbolOwner, IrField>()
private val outerThisDeclarations = HashMap<IrClass, IrField>()
@@ -63,7 +66,7 @@ class JvmDeclarationFactory(
if (!innerClass.isInner) throw AssertionError("Class is not inner: ${innerClass.dump()}")
else outerThisDeclarations.getOrPut(innerClass) {
val outerClass = innerClass.parent as? IrClass
?: throw AssertionError("No containing class for inner class ${innerClass.dump()}")
?: throw AssertionError("No containing class for inner class ${innerClass.dump()}")
val symbol = IrFieldSymbolImpl(
JvmPropertyDescriptorImpl.createFinalField(
@@ -86,60 +89,38 @@ class JvmDeclarationFactory(
}
private fun createInnerClassConstructorWithOuterThisParameter(oldConstructor: IrConstructor): IrConstructor {
val oldDescriptor = oldConstructor.descriptor
val classDescriptor = oldDescriptor.containingDeclaration
val outerThisType = (classDescriptor.containingDeclaration as ClassDescriptor).defaultType
val newDescriptor = ClassConstructorDescriptorImpl.createSynthesized(
classDescriptor, oldDescriptor.annotations, oldDescriptor.isPrimary, oldDescriptor.source
)
val outerThisValueParameter = newDescriptor.createValueParameter(0, "\$outer", outerThisType)
val newValueParameters =
listOf(outerThisValueParameter) +
oldDescriptor.valueParameters.map { it.copy(newDescriptor, it.name, it.index + 1) }
// Call the long version of `initialize()`, because otherwise default implementation inserts
// an unwanted `dispatchReceiverParameter`
newDescriptor.initialize(
oldDescriptor.extensionReceiverParameter?.copy(newDescriptor),
null,
oldDescriptor.typeParameters,
newValueParameters,
oldDescriptor.returnType,
oldDescriptor.modality,
oldDescriptor.visibility
)
val symbol = IrConstructorSymbolImpl(newDescriptor)
val newDescriptor = WrappedClassConstructorDescriptor(oldConstructor.descriptor.annotations)
return IrConstructorImpl(
oldConstructor.startOffset,
oldConstructor.endOffset,
oldConstructor.origin,
symbol,
oldConstructor.returnType
).also { constructor ->
newValueParameters.mapIndexedTo(constructor.valueParameters) { i, v ->
constructor.parent = oldConstructor.parent
if (i == 0) {
IrValueParameterImpl(
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
JvmLoweredDeclarationOrigin.FIELD_FOR_OUTER_THIS,
IrValueParameterSymbolImpl(v),
outerThisType.toIrType(symbolTable)!!,
null
)
} else {
val oldParameter = oldConstructor.valueParameters[i - 1]
IrValueParameterImpl(
oldParameter.startOffset, oldParameter.endOffset, oldParameter.origin,
IrValueParameterSymbolImpl(v), oldParameter.type, oldParameter.varargElementType
).also {
it.defaultValue = oldParameter.defaultValue
}
}
}
oldConstructor.startOffset, oldConstructor.endOffset, oldConstructor.origin,
IrConstructorSymbolImpl(newDescriptor),
oldConstructor.name, oldConstructor.visibility, oldConstructor.returnType,
oldConstructor.isInline, oldConstructor.isExternal, oldConstructor.isPrimary
).apply {
newDescriptor.bind(this)
annotations.addAll(oldConstructor.annotations.map { it.deepCopyWithWrappedDescriptors(this) })
parent = oldConstructor.parent
returnType = oldConstructor.returnType
copyTypeParametersFrom(oldConstructor)
constructor.metadata = oldConstructor.metadata
val outerThisType = oldConstructor.parentAsClass.parentAsClass.defaultType
val outerThisDescriptor = WrappedValueParameterDescriptor()
val outerThisValueParameter = IrValueParameterImpl(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, JvmLoweredDeclarationOrigin.FIELD_FOR_OUTER_THIS,
IrValueParameterSymbolImpl(outerThisDescriptor),
Name.identifier("\$outer"),
0,
type = outerThisType,
varargElementType = null,
isCrossinline = false,
isNoinline = false
).also {
outerThisDescriptor.bind(it)
it.parent = this
}
valueParameters.add(outerThisValueParameter)
oldConstructor.valueParameters.mapTo(valueParameters) { it.copyTo(this, index = it.index + 1) }
metadata = oldConstructor.metadata
}
}
@@ -223,6 +204,7 @@ class JvmDeclarationFactory(
).apply {
descriptor.bind(this)
parent = interfaceClass
createImplicitParameterDeclarationWithWrappedDescriptor()
}
}
}