[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
@@ -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)
}
}
}