diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyFunction.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyFunction.kt index a0dd5de0bde..c2d9b9e09bf 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyFunction.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyFunction.kt @@ -53,8 +53,9 @@ abstract class AbstractFir2IrLazyFunction( override val isInline: Boolean get() = fir.isInline - override val isExternal: Boolean - get() = fir.isExternal + override var isExternal: Boolean by lazyVar { + fir.isExternal + } override val isExpect: Boolean get() = fir.isExpect diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt index 8e88c2b00f1..69c05d294c3 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt @@ -84,8 +84,11 @@ class Fir2IrLazyClass( override val isData: Boolean get() = fir.isData - override val isExternal: Boolean + override var isExternal: Boolean get() = fir.isExternal + set(_) { + error("Mutating Fir2Ir lazy elements is not possible") + } override val isInline: Boolean get() = fir.isInline diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyConstructor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyConstructor.kt index 54e3ae91eb2..12ec673b12e 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyConstructor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyConstructor.kt @@ -50,8 +50,11 @@ class Fir2IrLazyConstructor( override val isInline: Boolean get() = fir.isInline - override val isExternal: Boolean + override var isExternal: Boolean get() = fir.isExternal + set(_) { + error("Mutating Fir2Ir lazy elements is not possible") + } override val isExpect: Boolean get() = fir.isExpect diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt index 8dc975fe056..5873eec2843 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt @@ -63,8 +63,11 @@ class Fir2IrLazyProperty( override val isDelegated: Boolean get() = fir.delegate != null - override val isExternal: Boolean + override var isExternal: Boolean get() = fir.isExternal + set(_) { + error("Mutating Fir2Ir lazy elements is not possible") + } override val isExpect: Boolean get() = fir.isExpect diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/MoveBodilessDeclarationsToSeparatePlace.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/MoveBodilessDeclarationsToSeparatePlace.kt index 3a812e56db2..3516496060b 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/MoveBodilessDeclarationsToSeparatePlace.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/MoveBodilessDeclarationsToSeparatePlace.kt @@ -48,6 +48,7 @@ private fun isBuiltInClass(declaration: IrDeclaration): Boolean = fun moveBodilessDeclarationsToSeparatePlace(context: JsIrBackendContext, moduleFragment: IrModuleFragment) { MoveBodilessDeclarationsToSeparatePlaceLowering(context).let { moveBodiless -> moduleFragment.files.forEach { + markExternalDeclarations(it) moveBodiless.lower(it) } } @@ -112,3 +113,31 @@ class MoveBodilessDeclarationsToSeparatePlaceLowering(private val context: JsIrB }, null) } } + +fun markExternalDeclarations(packageFragment: IrPackageFragment) { + for (declaration in packageFragment.declarations) { + if (declaration is IrPossiblyExternalDeclaration) { + if (declaration.isExternal) { + markNestedExternalDeclarations(declaration) + } + } + } +} + + +fun markNestedExternalDeclarations(declaration: IrDeclaration) { + if (declaration is IrPossiblyExternalDeclaration) { + declaration.isExternal = true + } + if (declaration is IrProperty) { + declaration.getter?.isExternal = true + declaration.setter?.isExternal = true + declaration.backingField?.isExternal = true + } + if (declaration is IrClass) { + declaration.declarations.forEach { + markNestedExternalDeclarations(it) + } + } +} + diff --git a/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt b/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt index 2f184aceeff..ec264e7d548 100644 --- a/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt +++ b/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt @@ -36,7 +36,7 @@ class IrClassImpl( override val isCompanion: Boolean = false, override val isInner: Boolean = false, override val isData: Boolean = false, - override val isExternal: Boolean = false, + override var isExternal: Boolean = false, override val isInline: Boolean = false, override val isExpect: Boolean = false, override val isFun: Boolean = false, diff --git a/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrConstructorImpl.kt b/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrConstructorImpl.kt index 8bb9e678b54..42b02e6120a 100644 --- a/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrConstructorImpl.kt +++ b/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrConstructorImpl.kt @@ -38,7 +38,7 @@ class IrConstructorImpl( override var visibility: DescriptorVisibility, returnType: IrType, override val isInline: Boolean, - override val isExternal: Boolean, + override var isExternal: Boolean, override val isPrimary: Boolean, override val isExpect: Boolean, override val containerSource: DeserializedContainerSource? = null, diff --git a/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrFieldImpl.kt b/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrFieldImpl.kt index c9602b4c5cf..3cd259e3bea 100644 --- a/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrFieldImpl.kt +++ b/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrFieldImpl.kt @@ -36,7 +36,7 @@ class IrFieldImpl( override var type: IrType, override var visibility: DescriptorVisibility, override val isFinal: Boolean, - override val isExternal: Boolean, + override var isExternal: Boolean, override val isStatic: Boolean, ) : IrField() { init { diff --git a/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt b/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt index 21fe68874af..f385e4ec8b4 100644 --- a/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt +++ b/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt @@ -29,7 +29,7 @@ abstract class IrFunctionCommonImpl( override var visibility: DescriptorVisibility, returnType: IrType, override val isInline: Boolean, - override val isExternal: Boolean, + override var isExternal: Boolean, override val isTailrec: Boolean, override val isSuspend: Boolean, override val isOperator: Boolean, diff --git a/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrPropertyImpl.kt b/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrPropertyImpl.kt index ec97784ef1a..c0486f9f244 100644 --- a/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrPropertyImpl.kt +++ b/compiler/ir/ir.tree.impl/src/org/jetbrains/kotlin/ir/declarations/impl/IrPropertyImpl.kt @@ -37,7 +37,7 @@ abstract class IrPropertyCommonImpl( override val isConst: Boolean, override val isLateinit: Boolean, override val isDelegated: Boolean, - override val isExternal: Boolean, + override var isExternal: Boolean, override val isExpect: Boolean, override val containerSource: DeserializedContainerSource?, ) : IrProperty() { diff --git a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrClass.kt b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrClass.kt index 5d249d1a231..67a8b24fa40 100644 --- a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrClass.kt +++ b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrClass.kt @@ -39,7 +39,7 @@ internal class PersistentIrClass( override val isCompanion: Boolean = false, override val isInner: Boolean = false, override val isData: Boolean = false, - override val isExternal: Boolean = false, + isExternal: Boolean = false, override val isInline: Boolean = false, override val isExpect: Boolean = false, override val isFun: Boolean = false, @@ -142,6 +142,16 @@ internal class PersistentIrClass( } } + override var isExternalField: Boolean = isExternal + + override var isExternal: Boolean + get() = getCarrier().isExternalField + set(v) { + if (isExternal != v) { + setCarrier().isExternalField = v + } + } + override var attributeOwnerIdField: IrAttributeContainer = this override var attributeOwnerId: IrAttributeContainer diff --git a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrConstructor.kt b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrConstructor.kt index 146af147243..05c22b2bc46 100644 --- a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrConstructor.kt +++ b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrConstructor.kt @@ -40,7 +40,7 @@ internal class PersistentIrConstructor( visibility: DescriptorVisibility, returnType: IrType, override val isInline: Boolean, - override val isExternal: Boolean, + isExternal: Boolean, override val isPrimary: Boolean, override val isExpect: Boolean, override val containerSource: DeserializedContainerSource? @@ -153,6 +153,16 @@ internal class PersistentIrConstructor( } } + override var isExternalField: Boolean = isExternal + + override var isExternal: Boolean + get() = getCarrier().isExternalField + set(v) { + if (isExternal != v) { + setCarrier().isExternalField = v + } + } + @ObsoleteDescriptorBasedAPI override val descriptor: ClassConstructorDescriptor get() = symbol.descriptor diff --git a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrField.kt b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrField.kt index 716cdcce774..0a3b2db6dff 100644 --- a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrField.kt +++ b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrField.kt @@ -38,7 +38,7 @@ internal class PersistentIrField( type: IrType, override var visibility: DescriptorVisibility, override val isFinal: Boolean, - override val isExternal: Boolean, + isExternal: Boolean, override val isStatic: Boolean ) : IrField(), PersistentIrDeclarationBase, @@ -104,4 +104,14 @@ internal class PersistentIrField( setCarrier().typeField = v } } + + override var isExternalField: Boolean = isExternal + + override var isExternal: Boolean + get() = getCarrier().isExternalField + set(v) { + if (isExternal != v) { + setCarrier().isExternalField = v + } + } } diff --git a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrFunction.kt b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrFunction.kt index 6802894d21e..e75fef79067 100644 --- a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrFunction.kt +++ b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrFunction.kt @@ -31,7 +31,7 @@ internal abstract class PersistentIrFunctionCommon( visibility: DescriptorVisibility, returnType: IrType, override val isInline: Boolean, - override val isExternal: Boolean, + isExternal: Boolean, override val isTailrec: Boolean, override val isSuspend: Boolean, override val isOperator: Boolean, @@ -173,6 +173,16 @@ internal abstract class PersistentIrFunctionCommon( setCarrier().correspondingPropertySymbolField = v } } + + override var isExternalField: Boolean = isExternal + + override var isExternal: Boolean + get() = getCarrier().isExternalField + set(v) { + if (isExternal != v) { + setCarrier().isExternalField = v + } + } } internal class PersistentIrFunction( diff --git a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrProperty.kt b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrProperty.kt index 12407ba9537..c9383041931 100644 --- a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrProperty.kt +++ b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrProperty.kt @@ -39,7 +39,7 @@ internal abstract class PersistentIrPropertyCommon( override val isConst: Boolean, override val isLateinit: Boolean, override val isDelegated: Boolean, - override val isExternal: Boolean, + isExternal: Boolean, override val isExpect: Boolean, override val containerSource: DeserializedContainerSource?, ) : IrProperty(), @@ -106,6 +106,16 @@ internal abstract class PersistentIrPropertyCommon( setCarrier().attributeOwnerIdField = v } } + + override var isExternalField: Boolean = isExternal + + override var isExternal: Boolean + get() = getCarrier().isExternalField + set(v) { + if (isExternal != v) { + setCarrier().isExternalField = v + } + } } internal class PersistentIrProperty( diff --git a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/ClassCarrier.kt b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/ClassCarrier.kt index 6a6bb7046d1..46732248661 100644 --- a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/ClassCarrier.kt +++ b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/ClassCarrier.kt @@ -16,6 +16,7 @@ internal interface ClassCarrier : DeclarationCarrier { var metadataField: MetadataSource? var visibilityField: DescriptorVisibility var modalityField: Modality + var isExternalField: Boolean var attributeOwnerIdField: IrAttributeContainer var typeParametersField: List var superTypesField: List @@ -32,7 +33,8 @@ internal interface ClassCarrier : DeclarationCarrier { modalityField, attributeOwnerIdField, typeParametersField, - superTypesField + superTypesField, + isExternalField ) } } @@ -48,5 +50,6 @@ internal class ClassCarrierImpl( override var modalityField: Modality, override var attributeOwnerIdField: IrAttributeContainer, override var typeParametersField: List, - override var superTypesField: List + override var superTypesField: List, + override var isExternalField: Boolean ) : ClassCarrier diff --git a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/ConstructorCarrier.kt b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/ConstructorCarrier.kt index 11dee7fcb92..85ee79cea81 100644 --- a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/ConstructorCarrier.kt +++ b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/ConstructorCarrier.kt @@ -25,7 +25,8 @@ internal interface ConstructorCarrier : FunctionBaseCarrier { metadataField, visibilityField, typeParametersField, - valueParametersField + valueParametersField, + isExternalField, ) } } @@ -42,5 +43,6 @@ internal class ConstructorCarrierImpl( override var metadataField: MetadataSource?, override var visibilityField: DescriptorVisibility, override var typeParametersField: List, - override var valueParametersField: List + override var valueParametersField: List, + override var isExternalField: Boolean, ) : ConstructorCarrier diff --git a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/FieldCarrier.kt b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/FieldCarrier.kt index 224a1ffbfb0..8da09c3fd20 100644 --- a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/FieldCarrier.kt +++ b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/FieldCarrier.kt @@ -18,6 +18,7 @@ internal interface FieldCarrier : DeclarationCarrier { var initializerField: IrExpressionBody? var correspondingPropertySymbolField: IrPropertySymbol? var metadataField: MetadataSource? + var isExternalField: Boolean override fun clone(): FieldCarrier { return FieldCarrierImpl( @@ -28,7 +29,8 @@ internal interface FieldCarrier : DeclarationCarrier { typeField, initializerField, correspondingPropertySymbolField, - metadataField + metadataField, + isExternalField, ) } } @@ -41,5 +43,6 @@ internal class FieldCarrierImpl( override var typeField: IrType, override var initializerField: IrExpressionBody?, override var correspondingPropertySymbolField: IrPropertySymbol?, - override var metadataField: MetadataSource? + override var metadataField: MetadataSource?, + override var isExternalField: Boolean ) : FieldCarrier diff --git a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/FunctionBaseCarrier.kt b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/FunctionBaseCarrier.kt index a677799a357..b2f27879fa2 100644 --- a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/FunctionBaseCarrier.kt +++ b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/FunctionBaseCarrier.kt @@ -21,4 +21,5 @@ internal interface FunctionBaseCarrier : DeclarationCarrier { var visibilityField: DescriptorVisibility var typeParametersField: List var valueParametersField: List + var isExternalField: Boolean } diff --git a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/FunctionCarrier.kt b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/FunctionCarrier.kt index 22ff537563d..80b113997fb 100644 --- a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/FunctionCarrier.kt +++ b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/FunctionCarrier.kt @@ -34,7 +34,8 @@ internal interface FunctionCarrier : FunctionBaseCarrier { valueParametersField, correspondingPropertySymbolField, overriddenSymbolsField, - attributeOwnerIdField + attributeOwnerIdField, + isExternalField, ) } } @@ -54,5 +55,6 @@ internal class FunctionCarrierImpl( override var valueParametersField: List, override var correspondingPropertySymbolField: IrPropertySymbol?, override var overriddenSymbolsField: List, - override var attributeOwnerIdField: IrAttributeContainer + override var attributeOwnerIdField: IrAttributeContainer, + override var isExternalField: Boolean, ) : FunctionCarrier diff --git a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/PropertyCarrier.kt b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/PropertyCarrier.kt index 02f64a30ca1..17dc84fc51e 100644 --- a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/PropertyCarrier.kt +++ b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/PropertyCarrier.kt @@ -14,6 +14,7 @@ internal interface PropertyCarrier : DeclarationCarrier { var setterField: IrSimpleFunction? var metadataField: MetadataSource? var attributeOwnerIdField: IrAttributeContainer + var isExternalField: Boolean override fun clone(): PropertyCarrier { return PropertyCarrierImpl( @@ -26,6 +27,7 @@ internal interface PropertyCarrier : DeclarationCarrier { setterField, metadataField, attributeOwnerIdField, + isExternalField, ) } } @@ -39,5 +41,6 @@ internal class PropertyCarrierImpl( override var getterField: IrSimpleFunction?, override var setterField: IrSimpleFunction?, override var metadataField: MetadataSource?, - override var attributeOwnerIdField: IrAttributeContainer + override var attributeOwnerIdField: IrAttributeContainer, + override var isExternalField: Boolean ) : PropertyCarrier diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt index 59b68ebdf0f..3de4027ca0a 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt @@ -29,7 +29,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor abstract class IrClass : - IrDeclarationBase(), IrDeclarationWithName, IrDeclarationWithVisibility, + IrDeclarationBase(), IrPossiblyExternalDeclaration, IrDeclarationWithVisibility, IrDeclarationContainer, IrTypeParametersContainer, IrAttributeContainer, IrMetadataSourceOwner { @ObsoleteDescriptorBasedAPI @@ -41,7 +41,6 @@ abstract class IrClass : abstract val isCompanion: Boolean abstract val isInner: Boolean abstract val isData: Boolean - abstract val isExternal: Boolean abstract val isInline: Boolean abstract val isExpect: Boolean abstract val isFun: Boolean diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt index 2d296e31522..f5a1939fd3e 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt @@ -17,8 +17,8 @@ package org.jetbrains.kotlin.ir.declarations import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.DescriptorVisibility +import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElementBase import org.jetbrains.kotlin.ir.IrStatement @@ -60,6 +60,10 @@ interface IrDeclarationWithName : IrDeclaration { val name: Name } +interface IrPossiblyExternalDeclaration : IrDeclarationWithName { + var isExternal: Boolean +} + interface IrOverridableMember : IrDeclarationWithVisibility, IrDeclarationWithName, IrSymbolOwner { val modality: Modality } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrField.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrField.kt index 43d7d2cf599..aff06ffc3a5 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrField.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrField.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementVisitor abstract class IrField : IrDeclarationBase(), - IrDeclarationWithName, IrDeclarationWithVisibility, IrDeclarationParent, IrMetadataSourceOwner { + IrPossiblyExternalDeclaration, IrDeclarationWithVisibility, IrDeclarationParent, IrMetadataSourceOwner { @ObsoleteDescriptorBasedAPI abstract override val descriptor: PropertyDescriptor @@ -24,7 +24,6 @@ abstract class IrField : abstract var type: IrType abstract val isFinal: Boolean - abstract val isExternal: Boolean abstract val isStatic: Boolean abstract var initializer: IrExpressionBody? diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFunction.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFunction.kt index 05e9f6a524a..de8b0c2b6c3 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFunction.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFunction.kt @@ -29,7 +29,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementVisitor abstract class IrFunction : IrDeclarationBase(), - IrDeclarationWithName, IrDeclarationWithVisibility, IrTypeParametersContainer, IrSymbolOwner, IrDeclarationParent, IrReturnTarget, + IrPossiblyExternalDeclaration, IrDeclarationWithVisibility, IrTypeParametersContainer, IrSymbolOwner, IrDeclarationParent, IrReturnTarget, IrMemberWithContainerSource, IrMetadataSourceOwner { @@ -38,7 +38,6 @@ abstract class IrFunction : abstract override val symbol: IrFunctionSymbol abstract val isInline: Boolean // NB: there's an inline constructor for Array and each primitive array class - abstract val isExternal: Boolean abstract val isExpect: Boolean abstract var returnType: IrType diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt index 27435508549..9db122e2fcd 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt @@ -21,10 +21,9 @@ import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor -import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource abstract class IrProperty : - IrDeclarationBase(), IrOverridableMember, IrMetadataSourceOwner, IrAttributeContainer, IrMemberWithContainerSource { + IrDeclarationBase(), IrPossiblyExternalDeclaration, IrOverridableMember, IrMetadataSourceOwner, IrAttributeContainer, IrMemberWithContainerSource { @ObsoleteDescriptorBasedAPI abstract override val descriptor: PropertyDescriptor abstract override val symbol: IrPropertySymbol @@ -33,7 +32,6 @@ abstract class IrProperty : abstract val isConst: Boolean abstract val isLateinit: Boolean abstract val isDelegated: Boolean - abstract val isExternal: Boolean abstract val isExpect: Boolean abstract val isFakeOverride: Boolean diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt index 247675cc629..052cbb850d9 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt @@ -32,7 +32,7 @@ class IrLazyClass( override val isCompanion: Boolean, override val isInner: Boolean, override val isData: Boolean, - override val isExternal: Boolean, + override var isExternal: Boolean, override val isInline: Boolean, override val isExpect: Boolean, override val isFun: Boolean, diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyConstructor.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyConstructor.kt index 81928a1efd8..b7f2ba5f21e 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyConstructor.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyConstructor.kt @@ -30,7 +30,7 @@ class IrLazyConstructor( override val name: Name, override var visibility: DescriptorVisibility, override val isInline: Boolean, - override val isExternal: Boolean, + override var isExternal: Boolean, override val isPrimary: Boolean, override val isExpect: Boolean, override val stubGenerator: DeclarationStubGenerator, diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyField.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyField.kt index 414072adfe2..e60906656f2 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyField.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyField.kt @@ -32,7 +32,7 @@ class IrLazyField( override val name: Name, override var visibility: DescriptorVisibility, override val isFinal: Boolean, - override val isExternal: Boolean, + override var isExternal: Boolean, override val isStatic: Boolean, override val stubGenerator: DeclarationStubGenerator, override val typeTranslator: TypeTranslator, diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunction.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunction.kt index b575411e7f2..c71ef05c1ab 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunction.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunction.kt @@ -34,7 +34,7 @@ class IrLazyFunction( override var visibility: DescriptorVisibility, override val modality: Modality, override val isInline: Boolean, - override val isExternal: Boolean, + override var isExternal: Boolean, override val isTailrec: Boolean, override val isSuspend: Boolean, override val isExpect: Boolean, diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyProperty.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyProperty.kt index 813d20352b3..2d33afc799f 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyProperty.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyProperty.kt @@ -34,7 +34,7 @@ class IrLazyProperty( override val isConst: Boolean, override val isLateinit: Boolean, override val isDelegated: Boolean, - override val isExternal: Boolean, + override var isExternal: Boolean, override val isExpect: Boolean, override val isFakeOverride: Boolean, override val stubGenerator: DeclarationStubGenerator, diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index f095109368b..aea264701db 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -313,23 +313,12 @@ fun IrCall.isSuperToAny() = superQualifierSymbol?.let { this.symbol.owner.isFake fun IrDeclaration.hasInterfaceParent() = parent.safeAs()?.isInterface == true -fun IrDeclaration.isEffectivelyExternal(): Boolean { - fun IrFunction.effectiveParentDeclaration(): IrDeclaration? = - when (this) { - is IrSimpleFunction -> correspondingPropertySymbol?.owner ?: parent as? IrDeclaration - else -> parent as? IrDeclaration - } +fun IrPossiblyExternalDeclaration.isEffectivelyExternal(): Boolean = + this.isExternal - val parent = parent - return when (this) { - is IrFunction -> isExternal || (effectiveParentDeclaration()?.isEffectivelyExternal() ?: false) - is IrField -> isExternal || parent is IrDeclaration && parent.isEffectivelyExternal() - is IrProperty -> isExternal || parent is IrDeclaration && parent.isEffectivelyExternal() - is IrClass -> isExternal || parent is IrDeclaration && parent.isEffectivelyExternal() - else -> false - } -} +fun IrDeclaration.isEffectivelyExternal(): Boolean = + this is IrPossiblyExternalDeclaration && this.isExternal fun IrFunction.isExternalOrInheritedFromExternal(): Boolean { fun isExternalOrInheritedFromExternalImpl(f: IrSimpleFunction): Boolean =