[JS IR] Control an inheritance of non-external entity from external
Add a special annotation @JsExternalInheritorsOnly for marking external interfaces and classes. The marked interface or class can’t be a parent for non external interfaces, classes or objects. ^KT-57423 Fixed
This commit is contained in:
committed by
Space Team
parent
6e7b078873
commit
4813b659ab
@@ -0,0 +1,135 @@
|
||||
// FIR_IDENTICAL
|
||||
|
||||
@OptIn(ExperimentalStdlibApi::class)
|
||||
@JsExternalInheritorsOnly
|
||||
external interface ExternalInterfaceX {
|
||||
val x: String
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalStdlibApi::class)
|
||||
@JsExternalInheritorsOnly
|
||||
external open class ExternalOpenClassX {
|
||||
val x: String
|
||||
}
|
||||
|
||||
// check interfaces
|
||||
|
||||
external interface ExternalInterfaceXY : ExternalInterfaceX {
|
||||
val y: String
|
||||
}
|
||||
|
||||
interface <!JS_EXTERNAL_INHERITORS_ONLY!>InterfaceXY<!> : ExternalInterfaceX {
|
||||
val y: String
|
||||
}
|
||||
|
||||
interface <!JS_EXTERNAL_INHERITORS_ONLY!>InterfaceXYZ<!> : ExternalInterfaceXY {
|
||||
val z: String
|
||||
}
|
||||
|
||||
// check objects
|
||||
|
||||
external object ExternalObjectXY : ExternalInterfaceX {
|
||||
override val x: String
|
||||
val y: String
|
||||
}
|
||||
|
||||
external object ExternalObjectXYZ : ExternalInterfaceXY {
|
||||
override val x: String
|
||||
override val y: String
|
||||
val z: String
|
||||
}
|
||||
|
||||
external object ExternalObjectXZ : ExternalOpenClassX {
|
||||
val z: String
|
||||
}
|
||||
|
||||
<!JS_EXTERNAL_INHERITORS_ONLY!>object ObjectXY<!> : ExternalInterfaceX {
|
||||
override val x: String = "X"
|
||||
val y: String = "Y"
|
||||
}
|
||||
|
||||
<!JS_EXTERNAL_INHERITORS_ONLY!>object ObjectXYZ<!> : ExternalInterfaceXY {
|
||||
override val x: String = "X"
|
||||
override val y: String = "Y"
|
||||
val z: String = "Z"
|
||||
}
|
||||
|
||||
<!JS_EXTERNAL_INHERITORS_ONLY!>object ObjectXZ<!> : ExternalOpenClassX() {
|
||||
val z: String = "Z"
|
||||
}
|
||||
|
||||
// check classes
|
||||
|
||||
external class ExternalClassXY : ExternalInterfaceX {
|
||||
override val x: String
|
||||
val y: String
|
||||
}
|
||||
|
||||
external class ExternalClassXYZ : ExternalInterfaceXY {
|
||||
override val x: String
|
||||
override val y: String
|
||||
val z: String
|
||||
}
|
||||
|
||||
external open class ExternalOpenClassXZ : ExternalOpenClassX {
|
||||
val z: String
|
||||
}
|
||||
|
||||
class <!JS_EXTERNAL_INHERITORS_ONLY!>ClassXY<!> : ExternalInterfaceX {
|
||||
override val x: String = "X"
|
||||
val y: String = "Y"
|
||||
}
|
||||
|
||||
class <!JS_EXTERNAL_INHERITORS_ONLY!>ClassXYZ<!> : ExternalInterfaceXY {
|
||||
override val x: String = "X"
|
||||
override val y: String = "Y"
|
||||
val z: String = "Z"
|
||||
}
|
||||
|
||||
class <!JS_EXTERNAL_INHERITORS_ONLY!>ClassXZ<!> : ExternalOpenClassX() {
|
||||
val z: String = "Z"
|
||||
}
|
||||
|
||||
class <!JS_EXTERNAL_INHERITORS_ONLY!>ClassXZY<!> : ExternalOpenClassXZ() {
|
||||
val y: String = "Y"
|
||||
}
|
||||
|
||||
// check nested
|
||||
|
||||
external class ExternalClassNameSpace {
|
||||
@OptIn(ExperimentalStdlibApi::class)
|
||||
@JsExternalInheritorsOnly
|
||||
interface NestedInterfaceX {
|
||||
val x: String
|
||||
}
|
||||
|
||||
interface NestedInterfaceXY : NestedInterfaceX {
|
||||
val y: String
|
||||
}
|
||||
}
|
||||
|
||||
external interface ExternalInterfaceXY2 : ExternalClassNameSpace.NestedInterfaceX {
|
||||
val y: String
|
||||
}
|
||||
|
||||
external interface ExternalInterfaceXYZ2 : ExternalClassNameSpace.NestedInterfaceXY {
|
||||
val z: String
|
||||
}
|
||||
|
||||
interface <!JS_EXTERNAL_INHERITORS_ONLY!>InterfaceXY2<!> : ExternalClassNameSpace.NestedInterfaceX {
|
||||
val y: String
|
||||
}
|
||||
|
||||
interface <!JS_EXTERNAL_INHERITORS_ONLY!>InterfaceXYZ2<!> : ExternalClassNameSpace.NestedInterfaceXY {
|
||||
val z: String
|
||||
}
|
||||
|
||||
// multiple inheritance
|
||||
|
||||
external class ExternalClassXY2 : ExternalInterfaceX, ExternalOpenClassX {
|
||||
val y: String
|
||||
}
|
||||
|
||||
class <!JS_EXTERNAL_INHERITORS_ONLY, JS_EXTERNAL_INHERITORS_ONLY!>ClassXY2<!> : ExternalInterfaceX, ExternalOpenClassX() {
|
||||
val y: String = "Y"
|
||||
}
|
||||
+238
@@ -0,0 +1,238 @@
|
||||
package
|
||||
|
||||
public final class ClassXY : ExternalInterfaceX {
|
||||
public constructor ClassXY()
|
||||
public open override /*1*/ val x: kotlin.String = "X"
|
||||
public final val y: kotlin.String = "Y"
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public final class ClassXY2 : ExternalInterfaceX, ExternalOpenClassX {
|
||||
public constructor ClassXY2()
|
||||
public final override /*2*/ /*fake_override*/ val x: kotlin.String
|
||||
public final val y: kotlin.String = "Y"
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public final class ClassXYZ : ExternalInterfaceXY {
|
||||
public constructor ClassXYZ()
|
||||
public open override /*1*/ val x: kotlin.String = "X"
|
||||
public open override /*1*/ val y: kotlin.String = "Y"
|
||||
public final val z: kotlin.String = "Z"
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public final class ClassXZ : ExternalOpenClassX {
|
||||
public constructor ClassXZ()
|
||||
public final override /*1*/ /*fake_override*/ val x: kotlin.String
|
||||
public final val z: kotlin.String = "Z"
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public final class ClassXZY : ExternalOpenClassXZ {
|
||||
public constructor ClassXZY()
|
||||
public final override /*1*/ /*fake_override*/ val x: kotlin.String
|
||||
public final val y: kotlin.String = "Y"
|
||||
public final override /*1*/ /*fake_override*/ val z: kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public final external class ExternalClassNameSpace {
|
||||
public constructor ExternalClassNameSpace()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
@kotlin.OptIn(markerClass = {kotlin.ExperimentalStdlibApi::class}) @kotlin.js.JsExternalInheritorsOnly public interface NestedInterfaceX {
|
||||
public abstract val x: kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public interface NestedInterfaceXY : ExternalClassNameSpace.NestedInterfaceX {
|
||||
public abstract override /*1*/ /*fake_override*/ val x: kotlin.String
|
||||
public abstract val y: kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
}
|
||||
|
||||
public final external class ExternalClassXY : ExternalInterfaceX {
|
||||
public constructor ExternalClassXY()
|
||||
public open override /*1*/ val x: kotlin.String
|
||||
public final val y: kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public final external class ExternalClassXY2 : ExternalInterfaceX, ExternalOpenClassX {
|
||||
public constructor ExternalClassXY2()
|
||||
public final override /*2*/ /*fake_override*/ val x: kotlin.String
|
||||
public final val y: kotlin.String
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public final external class ExternalClassXYZ : ExternalInterfaceXY {
|
||||
public constructor ExternalClassXYZ()
|
||||
public open override /*1*/ val x: kotlin.String
|
||||
public open override /*1*/ val y: kotlin.String
|
||||
public final val z: kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@kotlin.OptIn(markerClass = {kotlin.ExperimentalStdlibApi::class}) @kotlin.js.JsExternalInheritorsOnly public external interface ExternalInterfaceX {
|
||||
public abstract val x: kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public external interface ExternalInterfaceXY : ExternalInterfaceX {
|
||||
public abstract override /*1*/ /*fake_override*/ val x: kotlin.String
|
||||
public abstract val y: kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public external interface ExternalInterfaceXY2 : ExternalClassNameSpace.NestedInterfaceX {
|
||||
public abstract override /*1*/ /*fake_override*/ val x: kotlin.String
|
||||
public abstract val y: kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public external interface ExternalInterfaceXYZ2 : ExternalClassNameSpace.NestedInterfaceXY {
|
||||
public abstract override /*1*/ /*fake_override*/ val x: kotlin.String
|
||||
public abstract override /*1*/ /*fake_override*/ val y: kotlin.String
|
||||
public abstract val z: kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public external object ExternalObjectXY : ExternalInterfaceX {
|
||||
private constructor ExternalObjectXY()
|
||||
public open override /*1*/ val x: kotlin.String
|
||||
public final val y: kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public external object ExternalObjectXYZ : ExternalInterfaceXY {
|
||||
private constructor ExternalObjectXYZ()
|
||||
public open override /*1*/ val x: kotlin.String
|
||||
public open override /*1*/ val y: kotlin.String
|
||||
public final val z: kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public external object ExternalObjectXZ : ExternalOpenClassX {
|
||||
private constructor ExternalObjectXZ()
|
||||
public final override /*1*/ /*fake_override*/ val x: kotlin.String
|
||||
public final val z: kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@kotlin.OptIn(markerClass = {kotlin.ExperimentalStdlibApi::class}) @kotlin.js.JsExternalInheritorsOnly public open external class ExternalOpenClassX {
|
||||
public constructor ExternalOpenClassX()
|
||||
public final val x: kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open external class ExternalOpenClassXZ : ExternalOpenClassX {
|
||||
public constructor ExternalOpenClassXZ()
|
||||
public final override /*1*/ /*fake_override*/ val x: kotlin.String
|
||||
public final val z: kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public interface InterfaceXY : ExternalInterfaceX {
|
||||
public abstract override /*1*/ /*fake_override*/ val x: kotlin.String
|
||||
public abstract val y: kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public interface InterfaceXY2 : ExternalClassNameSpace.NestedInterfaceX {
|
||||
public abstract override /*1*/ /*fake_override*/ val x: kotlin.String
|
||||
public abstract val y: kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public interface InterfaceXYZ : ExternalInterfaceXY {
|
||||
public abstract override /*1*/ /*fake_override*/ val x: kotlin.String
|
||||
public abstract override /*1*/ /*fake_override*/ val y: kotlin.String
|
||||
public abstract val z: kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public interface InterfaceXYZ2 : ExternalClassNameSpace.NestedInterfaceXY {
|
||||
public abstract override /*1*/ /*fake_override*/ val x: kotlin.String
|
||||
public abstract override /*1*/ /*fake_override*/ val y: kotlin.String
|
||||
public abstract val z: kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public object ObjectXY : ExternalInterfaceX {
|
||||
private constructor ObjectXY()
|
||||
public open override /*1*/ val x: kotlin.String = "X"
|
||||
public final val y: kotlin.String = "Y"
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public object ObjectXYZ : ExternalInterfaceXY {
|
||||
private constructor ObjectXYZ()
|
||||
public open override /*1*/ val x: kotlin.String = "X"
|
||||
public open override /*1*/ val y: kotlin.String = "Y"
|
||||
public final val z: kotlin.String = "Z"
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public object ObjectXZ : ExternalOpenClassX {
|
||||
private constructor ObjectXZ()
|
||||
public final override /*1*/ /*fake_override*/ val x: kotlin.String
|
||||
public final val z: kotlin.String = "Z"
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user