Refine modality of fake overrides inherited from abstract expected members

In an open expected class inheriting an expected interface, abstract
members are now inherited as _open_ fake overrides, not final. Final was
technically safer but also stricter and thus could be unexpected by the
user. In a final class, abstract members are still inherited as _final_
fake overrides. So, the general rule is now the following: the modality
of an expected fake override, which overrides only abstract members, in
a non-abstract class is equal to the modality of that class

 #KT-22031 Fixed
This commit is contained in:
Alexander Udalov
2018-02-13 14:25:57 +01:00
parent fe3ce1ec7c
commit 60a551404a
4 changed files with 48 additions and 22 deletions
@@ -17,14 +17,14 @@ public interface Foo {
public final expect class ImplicitFoo : Foo {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
public final override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final expect class ImplicitFooCheck : Foo {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
public final override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -9,7 +9,7 @@ expect open class BaseAImpl() : BaseA
class DerivedA1 : BaseAImpl()
class DerivedA2 : BaseAImpl() {
<!OVERRIDING_FINAL_MEMBER!>override<!> fun foo() = super.foo()
override fun foo() = super.foo()
}
@@ -21,7 +21,7 @@ expect open class BaseBImpl() : BaseB
class DerivedB1 : BaseBImpl()
class DerivedB2 : BaseBImpl() {
<!OVERRIDING_FINAL_MEMBER!>override<!> fun foo() = super.foo()
override fun foo() = super.foo()
}
@@ -53,3 +53,10 @@ expect interface BaseE {
sealed class BaseEImpl() : BaseE {
fun bar() = super.<!ABSTRACT_SUPER_CALL!>foo<!>()
}
expect interface BaseF {
fun foo()
}
expect class BaseFImpl() : BaseF
@@ -11,7 +11,7 @@ public abstract expect class BaseA {
public open expect class BaseAImpl : BaseA {
public constructor BaseAImpl()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final expect override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
public open expect override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -26,7 +26,7 @@ public expect interface BaseB {
public open expect class BaseBImpl : BaseB {
public constructor BaseBImpl()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final expect override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
public open expect override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -78,10 +78,25 @@ public sealed class BaseEImpl : BaseE {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public expect interface BaseF {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract expect fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final expect class BaseFImpl : BaseF {
public constructor BaseFImpl()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final expect override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class DerivedA1 : BaseAImpl {
public constructor DerivedA1()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final expect override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
public open expect override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -97,7 +112,7 @@ public final class DerivedA2 : BaseAImpl {
public final class DerivedB1 : BaseBImpl {
public constructor DerivedB1()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final expect override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
public open expect override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}