From df1d9a011373b5b40f908899b36662cf5afbc68e Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Tue, 8 Sep 2020 09:45:10 +0300 Subject: [PATCH] IR: make IrTypeParameter.superTypes persistent mutable field --- .../kotlin/fir/backend/Fir2IrClassifierStorage.kt | 4 ++-- .../kotlin/fir/lazy/AbstractFir2IrLazyDeclaration.kt | 2 +- .../org/jetbrains/kotlin/backend/common/ir/IrUtils.kt | 6 +++--- .../backend/common/lower/LocalDeclarationsLowering.kt | 2 +- .../ir/builders/declarations/declarationBuilders.kt | 2 +- .../kotlin/psi2ir/generators/DeclarationGenerator.kt | 2 +- .../generators/StandaloneDeclarationGenerator.kt | 2 +- .../kotlin/ir/declarations/impl/IrTypeParameterImpl.kt | 2 +- .../persistent/PersistentIrTypeParameter.kt | 10 +++++++++- .../persistent/carriers/TypeParameterCarrier.kt | 8 ++++++-- .../kotlin/ir/declarations/IrTypeParameter.kt | 2 +- .../kotlin/ir/declarations/lazy/IrLazyTypeParameter.kt | 2 +- .../kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt | 4 ++-- .../backend/common/serialization/IrFileDeserializer.kt | 2 +- .../compiler/backend/ir/GeneratorHelpers.kt | 2 +- 15 files changed, 32 insertions(+), 20 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt index 0a9e5ee570d..e56ecaf571b 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt @@ -111,7 +111,7 @@ class Fir2IrClassifierStorage( getIrTypeParameter(typeParameter, index, typeContext).apply { parent = this@setTypeParameters if (superTypes.isEmpty()) { - typeParameter.bounds.mapTo(superTypes) { it.toIrType() } + superTypes = typeParameter.bounds.map { it.toIrType() } } } } @@ -369,7 +369,7 @@ class Fir2IrClassifierStorage( getCachedIrTypeParameter(typeParameter, index, typeContext)?.let { return it } return typeParameter.run { val irTypeParameter = createIrTypeParameterWithoutBounds(typeParameter, index, typeContext) - bounds.mapTo(irTypeParameter.superTypes) { it.toIrType() } + irTypeParameter.superTypes = bounds.map { it.toIrType() } irTypeParameter } } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyDeclaration.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyDeclaration.kt index e29c3a623a5..36fa739b032 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyDeclaration.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyDeclaration.kt @@ -32,7 +32,7 @@ interface AbstractFir2IrLazyDeclaration - tp.superTypes.replaceAll { localFunctionContext.remapType(it) } + tp.superTypes = tp.superTypes.map { localFunctionContext.remapType(it) } } newDeclaration.parent = memberOwner diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt index a6cc7f4756b..010e26f0673 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt @@ -291,7 +291,7 @@ internal fun IrFactory.buildTypeParameter(builder: IrTypeParameterBuilder, paren name, index, isReified, variance ).also { wrappedDescriptor.bind(it) - it.superTypes.addAll(superTypes) + it.superTypes = superTypes it.parent = parent } } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt index 2a3204f1e3f..1622ece2f5f 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt @@ -147,7 +147,7 @@ class DeclarationGenerator(override val context: GeneratorContext) : Generator { } for (irTypeParameter in irTypeParametersOwner.typeParameters) { - irTypeParameter.descriptor.upperBounds.mapTo(irTypeParameter.superTypes) { + irTypeParameter.superTypes = irTypeParameter.descriptor.upperBounds.map { it.toIrType() } } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StandaloneDeclarationGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StandaloneDeclarationGenerator.kt index 94bedd4f429..776cc8a17c4 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StandaloneDeclarationGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StandaloneDeclarationGenerator.kt @@ -70,7 +70,7 @@ class StandaloneDeclarationGenerator(private val context: GeneratorContext) { } for (irTypeParameter in irTypeParametersOwner.typeParameters) { - irTypeParameter.descriptor.upperBounds.mapTo(irTypeParameter.superTypes) { + irTypeParameter.superTypes = irTypeParameter.descriptor.upperBounds.map { it.toIrType() } } diff --git a/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrTypeParameterImpl.kt b/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrTypeParameterImpl.kt index c18c62ea380..b716c6c27c1 100644 --- a/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrTypeParameterImpl.kt +++ b/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrTypeParameterImpl.kt @@ -53,5 +53,5 @@ class IrTypeParameterImpl( override val descriptor: TypeParameterDescriptor get() = symbol.descriptor - override val superTypes: MutableList = SmartList() + override var superTypes: List = emptyList() } diff --git a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrTypeParameter.kt b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrTypeParameter.kt index c0133964d8f..bdb48bfbc96 100644 --- a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrTypeParameter.kt +++ b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrTypeParameter.kt @@ -62,5 +62,13 @@ internal class PersistentIrTypeParameter( override val descriptor: TypeParameterDescriptor get() = symbol.descriptor - override val superTypes: MutableList = SmartList() + override var superTypesField: List = emptyList() + + override var superTypes: List + get() = getCarrier().superTypesField + set(v) { + if (superTypes !== v) { + setCarrier().superTypesField = v + } + } } diff --git a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/TypeParameterCarrier.kt b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/TypeParameterCarrier.kt index 88fa852b3c1..2b10ca10f5a 100644 --- a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/TypeParameterCarrier.kt +++ b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/TypeParameterCarrier.kt @@ -8,10 +8,13 @@ package org.jetbrains.kotlin.ir.declarations.persistent.carriers import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent import org.jetbrains.kotlin.ir.expressions.IrConstructorCall +import org.jetbrains.kotlin.ir.types.IrType internal interface TypeParameterCarrier : DeclarationCarrier { + var superTypesField: List + override fun clone(): TypeParameterCarrier { - return TypeParameterCarrierImpl(lastModified, parentField, originField, annotationsField) + return TypeParameterCarrierImpl(lastModified, parentField, originField, annotationsField, superTypesField) } } @@ -19,5 +22,6 @@ internal class TypeParameterCarrierImpl( override val lastModified: Int, override var parentField: IrDeclarationParent?, override var originField: IrDeclarationOrigin, - override var annotationsField: List + override var annotationsField: List, + override var superTypesField: List, ) : TypeParameterCarrier diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrTypeParameter.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrTypeParameter.kt index 2c7c8e05d50..e6efde84b05 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrTypeParameter.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrTypeParameter.kt @@ -31,7 +31,7 @@ abstract class IrTypeParameter : IrDeclarationBase(), IrSymbolDeclaration + abstract var superTypes: List override fun accept(visitor: IrElementVisitor, data: D): R = visitor.visitTypeParameter(this, data) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyTypeParameter.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyTypeParameter.kt index 6a5714ba207..11be239e09f 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyTypeParameter.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyTypeParameter.kt @@ -38,7 +38,7 @@ class IrLazyTypeParameter( override var annotations: List by createLazyAnnotations() - override val superTypes: MutableList by lazy { + override var superTypes: List by lazyVar { withInitialIr { typeTranslator.buildWithScope(this.parent as IrTypeParametersContainer) { val descriptor = symbol.descriptor diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt index 7f7837b0a54..aa839852a35 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt @@ -308,7 +308,7 @@ open class DeepCopyIrTreeWithSymbols( override fun visitTypeParameter(declaration: IrTypeParameter): IrTypeParameter = copyTypeParameter(declaration).apply { // TODO type parameter scopes? - declaration.superTypes.mapTo(superTypes) { it.remapType() } + superTypes = declaration.superTypes.map { it.remapType() } } private fun copyTypeParameter(declaration: IrTypeParameter): IrTypeParameter = @@ -331,7 +331,7 @@ open class DeepCopyIrTreeWithSymbols( typeRemapper.withinScope(this) { for ((thisTypeParameter, otherTypeParameter) in this.typeParameters.zip(other.typeParameters)) { - otherTypeParameter.superTypes.mapTo(thisTypeParameter.superTypes) { + thisTypeParameter.superTypes = otherTypeParameter.superTypes.map { typeRemapper.remapType(it) } } diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt index c277ebce50f..3561780d563 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt @@ -1090,7 +1090,7 @@ abstract class IrFileDeserializer( } for (i in protos.indices) { - protos[i].superTypeList.mapTo(result[i].superTypes) { deserializeIrType(it) } + result[i].superTypes = protos[i].superTypeList.map { deserializeIrType(it) } } return result diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt index 0f36012c16d..6d6f0497721 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt @@ -416,7 +416,7 @@ interface IrBuilderExtension { } newTypeParameters.forEach { typeParameter -> - typeParameter.superTypes.addAll(typeParameter.descriptor.upperBounds.map { it.toIrType() }) + typeParameter.superTypes = typeParameter.descriptor.upperBounds.map { it.toIrType() } } typeParameters = newTypeParameters