[K/JS] fix(KT-46643): prevent removal of setter for overridden external field.

This commit is contained in:
Artem Kobzar
2022-07-29 12:41:17 +00:00
committed by Space
parent 1c39042e7a
commit b9189be728
9 changed files with 138 additions and 4 deletions
@@ -77,7 +77,8 @@ private fun IrDeclaration.addRootsTo(
}
}
this is IrSimpleFunction -> {
if (correspondingPropertySymbol?.owner?.isExported(context) == true) {
val correspondingProperty = correspondingPropertySymbol?.owner ?: return
if (correspondingProperty.isExported(context)) {
acceptVoid(nestedVisitor)
}
}
@@ -185,6 +185,10 @@ abstract class UsefulDeclarationProcessor(
}
}
if (declaration is IrSimpleFunction && declaration.isAccessorForOverriddenExternalField()) {
declaration.enqueue(declaration.correspondingPropertySymbol!!.owner, "overrides external property")
}
// A hack to enforce property lowering.
// Until a getter is accessed it doesn't get moved to the declaration list.
if (declaration is IrProperty) {
@@ -197,6 +201,14 @@ abstract class UsefulDeclarationProcessor(
}
}
private fun IrSimpleFunction.isAccessorForOverriddenExternalField(): Boolean {
return correspondingPropertySymbol?.owner?.isExternalOrOverriddenExternal() ?: false
}
private fun IrProperty.isExternalOrOverriddenExternal(): Boolean {
return isEffectivelyExternal() || overriddenSymbols.any { it.owner.isExternalOrOverriddenExternal() }
}
protected open fun handleAssociatedObjects(): Unit = Unit
fun collectDeclarations(rootDeclarations: Iterable<IrDeclaration>): Set<IrDeclaration> {
@@ -416,7 +416,7 @@ fun IrSimpleFunction?.shouldExportAccessor(context: JsIrBackendContext): Boolean
if (parentAsClass.isExported(context)) return true
return overriddenStableProperty(context)
return isAccessorOfOverriddenStableProperty(context)
}
fun IrSimpleFunction.overriddenStableProperty(context: JsIrBackendContext): Boolean {
@@ -429,10 +429,14 @@ fun IrSimpleFunction.overriddenStableProperty(context: JsIrBackendContext): Bool
return overridesExternal() || property.getJsName() != null
}
private fun IrSimpleFunction.overridesExternal(): Boolean {
fun IrSimpleFunction.isAccessorOfOverriddenStableProperty(context: JsIrBackendContext): Boolean {
return overriddenStableProperty(context) || correspondingPropertySymbol!!.owner.overridesExternal()
}
private fun IrOverridableDeclaration<*>.overridesExternal(): Boolean {
if (this.isEffectivelyExternal()) return true
return this.overriddenSymbols.any { it.owner.overridesExternal() }
return overriddenSymbols.any { (it.owner as IrOverridableDeclaration<*>).overridesExternal() }
}
private val IrClassifierSymbol.isInterface get() = (owner as? IrClass)?.isInterface == true