[IR] Make isExternal mutable and accessible via common interface

JS IR: Mark all effectively external declarations as external to access it
directly instead of computing it every time
This commit is contained in:
Svyatoslav Kuzmich
2020-11-11 18:33:08 +03:00
parent 924a7b009b
commit 2a424ad2af
32 changed files with 145 additions and 54 deletions
@@ -53,8 +53,9 @@ abstract class AbstractFir2IrLazyFunction<F : FirMemberDeclaration>(
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
@@ -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
@@ -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
@@ -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
@@ -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)
}
}
}
@@ -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,
@@ -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,
@@ -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 {
@@ -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,
@@ -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() {
@@ -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
@@ -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
@@ -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<FieldCarrier>,
@@ -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
}
}
}
@@ -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(
@@ -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(
@@ -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<IrTypeParameter>
var superTypesField: List<IrType>
@@ -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<IrTypeParameter>,
override var superTypesField: List<IrType>
override var superTypesField: List<IrType>,
override var isExternalField: Boolean
) : ClassCarrier
@@ -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<IrTypeParameter>,
override var valueParametersField: List<IrValueParameter>
override var valueParametersField: List<IrValueParameter>,
override var isExternalField: Boolean,
) : ConstructorCarrier
@@ -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
@@ -21,4 +21,5 @@ internal interface FunctionBaseCarrier : DeclarationCarrier {
var visibilityField: DescriptorVisibility
var typeParametersField: List<IrTypeParameter>
var valueParametersField: List<IrValueParameter>
var isExternalField: Boolean
}
@@ -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<IrValueParameter>,
override var correspondingPropertySymbolField: IrPropertySymbol?,
override var overriddenSymbolsField: List<IrSimpleFunctionSymbol>,
override var attributeOwnerIdField: IrAttributeContainer
override var attributeOwnerIdField: IrAttributeContainer,
override var isExternalField: Boolean,
) : FunctionCarrier
@@ -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
@@ -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
@@ -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
}
@@ -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?
@@ -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
@@ -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
@@ -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,
@@ -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,
@@ -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,
@@ -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,
@@ -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,
@@ -313,23 +313,12 @@ fun IrCall.isSuperToAny() = superQualifierSymbol?.let { this.symbol.owner.isFake
fun IrDeclaration.hasInterfaceParent() =
parent.safeAs<IrClass>()?.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 =