deprecate required classes for traits
This commit is contained in:
committed by
Andrey Breslav
parent
7b0f6018dc
commit
900a16a315
@@ -188,6 +188,8 @@ public interface Errors {
|
||||
|
||||
DiagnosticFactory0<JetDelegatorByExpressionSpecifier> DELEGATION_IN_TRAIT = DiagnosticFactory0.create(ERROR);
|
||||
|
||||
DiagnosticFactory0<PsiElement> TRAIT_WITH_SUPERCLASS = DiagnosticFactory0.create(WARNING);
|
||||
|
||||
DiagnosticFactory2<JetNamedDeclaration, ClassDescriptor, ClassDescriptor> UNMET_TRAIT_REQUIREMENT =
|
||||
DiagnosticFactory2.create(ERROR, PositioningStrategies.DECLARATION_NAME);
|
||||
|
||||
|
||||
+1
@@ -385,6 +385,7 @@ public class DefaultErrorMessages {
|
||||
MAP.put(SUPERTYPE_INITIALIZED_IN_TRAIT, "Traits cannot initialize supertypes");
|
||||
MAP.put(CLASS_IN_SUPERTYPE_FOR_ENUM, "Enum class cannot inherit from classes");
|
||||
MAP.put(CONSTRUCTOR_IN_TRAIT, "A trait may not have a constructor");
|
||||
MAP.put(TRAIT_WITH_SUPERCLASS, "Specifying a required base class for trait implementations is deprecated");
|
||||
MAP.put(SUPERTYPE_APPEARS_TWICE, "A supertype appears twice");
|
||||
MAP.put(FINAL_SUPERTYPE, "This type is final, so it cannot be inherited from");
|
||||
MAP.put(SINGLETON_IN_SUPERTYPE, "Cannot inherit from a singleton");
|
||||
|
||||
@@ -416,6 +416,10 @@ public class BodyResolver {
|
||||
if (supertypeOwner.getKind() == ClassKind.ENUM_CLASS) {
|
||||
trace.report(CLASS_IN_SUPERTYPE_FOR_ENUM.on(typeReference));
|
||||
}
|
||||
else if (supertypeOwner.getKind() == ClassKind.TRAIT &&
|
||||
!classAppeared && !TypesPackage.isDynamic(supertype) /* avoid duplicate diagnostics */) {
|
||||
trace.report(TRAIT_WITH_SUPERCLASS.on(typeReference));
|
||||
}
|
||||
if (classAppeared) {
|
||||
trace.report(MANY_CLASSES_IN_SUPERTYPE_LIST.on(typeReference));
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
open class Base() {
|
||||
trait Base {
|
||||
fun f() = 1
|
||||
}
|
||||
|
||||
open class Left() : Base()
|
||||
open class Left() : Base
|
||||
|
||||
trait Right : Base
|
||||
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
package
|
||||
|
||||
internal open class Base {
|
||||
public constructor Base()
|
||||
internal trait Base {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal final fun f(): kotlin.Int
|
||||
internal open fun f(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -11,7 +10,7 @@ internal open class Base {
|
||||
internal final class Diamond : Left, Right {
|
||||
public constructor Diamond()
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal final override /*2*/ /*fake_override*/ fun f(): kotlin.Int
|
||||
internal open override /*2*/ /*fake_override*/ fun f(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -19,14 +18,14 @@ internal final class Diamond : Left, Right {
|
||||
internal open class Left : Base {
|
||||
public constructor Left()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal final override /*1*/ /*fake_override*/ fun f(): kotlin.Int
|
||||
internal open override /*1*/ /*fake_override*/ fun f(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal trait Right : Base {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal final override /*1*/ /*fake_override*/ fun f(): kotlin.Int
|
||||
internal open override /*1*/ /*fake_override*/ fun f(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
open class Base<P>() {
|
||||
trait Base<P> {
|
||||
fun f() = 1
|
||||
}
|
||||
|
||||
open class Left<P>() : Base<P>()
|
||||
open class Left<P>() : Base<P>
|
||||
|
||||
trait Right<P> : Base<P>
|
||||
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
package
|
||||
|
||||
internal open class Base</*0*/ P> {
|
||||
public constructor Base</*0*/ P>()
|
||||
internal trait Base</*0*/ P> {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal final fun f(): kotlin.Int
|
||||
internal open fun f(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -11,7 +10,7 @@ internal open class Base</*0*/ P> {
|
||||
internal final class Diamond</*0*/ P> : Left<P>, Right<P> {
|
||||
public constructor Diamond</*0*/ P>()
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal final override /*2*/ /*fake_override*/ fun f(): kotlin.Int
|
||||
internal open override /*2*/ /*fake_override*/ fun f(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -19,14 +18,14 @@ internal final class Diamond</*0*/ P> : Left<P>, Right<P> {
|
||||
internal open class Left</*0*/ P> : Base<P> {
|
||||
public constructor Left</*0*/ P>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal final override /*1*/ /*fake_override*/ fun f(): kotlin.Int
|
||||
internal open override /*1*/ /*fake_override*/ fun f(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal trait Right</*0*/ P> : Base<P> {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal final override /*1*/ /*fake_override*/ fun f(): kotlin.Int
|
||||
internal open override /*1*/ /*fake_override*/ fun f(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
|
||||
open class Base() {
|
||||
var v : Int = 0
|
||||
trait Base {
|
||||
var v : Int
|
||||
get() = 1
|
||||
set(v) {}
|
||||
}
|
||||
|
||||
open class Left() : Base()
|
||||
open class Left() : Base
|
||||
|
||||
trait Right : Base
|
||||
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
package
|
||||
|
||||
internal open class Base {
|
||||
public constructor Base()
|
||||
internal final var v: kotlin.Int
|
||||
internal trait Base {
|
||||
internal open var v: kotlin.Int
|
||||
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
|
||||
@@ -10,7 +9,7 @@ internal open class Base {
|
||||
|
||||
internal final class Diamond : Left, Right {
|
||||
public constructor Diamond()
|
||||
internal final override /*2*/ /*fake_override*/ var v: kotlin.Int
|
||||
internal open override /*2*/ /*fake_override*/ var v: kotlin.Int
|
||||
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
|
||||
@@ -18,14 +17,14 @@ internal final class Diamond : Left, Right {
|
||||
|
||||
internal open class Left : Base {
|
||||
public constructor Left()
|
||||
internal final override /*1*/ /*fake_override*/ var v: kotlin.Int
|
||||
internal open override /*1*/ /*fake_override*/ var v: kotlin.Int
|
||||
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
|
||||
}
|
||||
|
||||
internal trait Right : Base {
|
||||
internal final override /*1*/ /*fake_override*/ var v: kotlin.Int
|
||||
internal open override /*1*/ /*fake_override*/ var v: kotlin.Int
|
||||
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
|
||||
|
||||
@@ -24,17 +24,17 @@ trait T2<T> {}
|
||||
trait Test<!CONSTRUCTOR_IN_TRAIT!>()<!> {
|
||||
}
|
||||
|
||||
trait Test1 : C2<!SUPERTYPE_INITIALIZED_IN_TRAIT!>()<!> {}
|
||||
trait Test1 : <!TRAIT_WITH_SUPERCLASS!>C2<!><!SUPERTYPE_INITIALIZED_IN_TRAIT!>()<!> {}
|
||||
|
||||
trait Test2 : C2 {}
|
||||
trait Test2 : <!TRAIT_WITH_SUPERCLASS!>C2<!> {}
|
||||
|
||||
trait Test3 : C2, <!MANY_CLASSES_IN_SUPERTYPE_LIST!>C3<!> {}
|
||||
trait Test3 : <!TRAIT_WITH_SUPERCLASS!>C2<!>, <!MANY_CLASSES_IN_SUPERTYPE_LIST!>C3<!> {}
|
||||
|
||||
trait Test4 : T1 {}
|
||||
|
||||
trait Test5 : T1, <!SUPERTYPE_APPEARS_TWICE!>T1<!> {}
|
||||
|
||||
trait Test6 : <!FINAL_SUPERTYPE!>C1<!> {}
|
||||
trait Test6 : <!TRAIT_WITH_SUPERCLASS, FINAL_SUPERTYPE!>C1<!> {}
|
||||
|
||||
class CTest1() : OC1() {}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
trait MyTrait: <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>Object<!> {
|
||||
trait MyTrait: <!PLATFORM_CLASS_MAPPED_TO_KOTLIN, TRAIT_WITH_SUPERCLASS!>Object<!> {
|
||||
override fun toString(): String
|
||||
public override fun finalize()
|
||||
public <!OVERRIDING_FINAL_MEMBER!>override<!> fun wait()
|
||||
|
||||
+1
-1
@@ -2,6 +2,6 @@ open class C {
|
||||
val x = 1
|
||||
}
|
||||
|
||||
trait Tr : C {
|
||||
trait Tr : <!TRAIT_WITH_SUPERCLASS!>C<!> {
|
||||
<!ACCIDENTAL_OVERRIDE!>fun getX()<!> = 1
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
trait X: Any<!NULLABLE_SUPERTYPE!>?<!><!REDUNDANT_NULLABLE!>?<!> {
|
||||
trait A
|
||||
trait X: A<!NULLABLE_SUPERTYPE!>?<!><!REDUNDANT_NULLABLE!>?<!> {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,13 @@ package
|
||||
|
||||
internal fun </*0*/ T> interaction(/*0*/ t: T): kotlin.Unit
|
||||
|
||||
internal trait X {
|
||||
internal trait A {
|
||||
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
|
||||
}
|
||||
|
||||
internal trait X : A? {
|
||||
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
|
||||
|
||||
@@ -6,6 +6,6 @@ open class Bbb() : Aaa() {
|
||||
override fun foo() = 2
|
||||
}
|
||||
|
||||
trait Ccc : Aaa
|
||||
trait Ccc : <!TRAIT_WITH_SUPERCLASS!>Aaa<!>
|
||||
|
||||
class Ddd() : Bbb(), Ccc
|
||||
@@ -4,7 +4,7 @@ open class AL {
|
||||
fun get(i : Int) : Any? = i
|
||||
}
|
||||
|
||||
trait ALE<T> : AL {
|
||||
trait ALE<T> : <!TRAIT_WITH_SUPERCLASS!>AL<!> {
|
||||
fun getOrNull(index: Int, value: T) : T {
|
||||
return <!UNCHECKED_CAST!>get(index) as? T<!> ?: value
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ open class A {
|
||||
open fun foo() {}
|
||||
}
|
||||
|
||||
trait ATrait : A {
|
||||
trait ATrait : <!TRAIT_WITH_SUPERCLASS!>A<!> {
|
||||
|
||||
override fun foo() {
|
||||
<!SUPERCLASS_NOT_ACCESSIBLE_FROM_TRAIT!>super<A><!>.foo()
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
open class Required
|
||||
|
||||
trait Trait : Required
|
||||
trait Trait : <!TRAIT_WITH_SUPERCLASS!>Required<!>
|
||||
|
||||
abstract <!UNMET_TRAIT_REQUIREMENT!>class Abstract<!> : Trait
|
||||
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
open class Required
|
||||
|
||||
trait A : Required
|
||||
trait A : <!TRAIT_WITH_SUPERCLASS!>Required<!>
|
||||
|
||||
val a = <!UNMET_TRAIT_REQUIREMENT!>object<!> : A {}
|
||||
val b: A = object : A, Required() {}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
open class Generic<T>
|
||||
|
||||
trait A : Generic<Int>
|
||||
trait A : <!TRAIT_WITH_SUPERCLASS!>Generic<Int><!>
|
||||
|
||||
trait B : Generic<String>
|
||||
trait B : <!TRAIT_WITH_SUPERCLASS!>Generic<String><!>
|
||||
|
||||
<!UNMET_TRAIT_REQUIREMENT, UNMET_TRAIT_REQUIREMENT!>class Y<!> : <!INCONSISTENT_TYPE_PARAMETER_VALUES!>A, B<!>
|
||||
class Z : <!INCONSISTENT_TYPE_PARAMETER_VALUES!>A, B, Generic<Int>()<!>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
open class Base {
|
||||
}
|
||||
|
||||
trait Derived: Base {
|
||||
trait Derived: <!TRAIT_WITH_SUPERCLASS!>Base<!> {
|
||||
fun foo() {
|
||||
f1(this@Derived)
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
open class A
|
||||
open class B
|
||||
|
||||
trait C : A, <!MANY_CLASSES_IN_SUPERTYPE_LIST!>B<!>
|
||||
trait C : <!TRAIT_WITH_SUPERCLASS!>A<!>, <!MANY_CLASSES_IN_SUPERTYPE_LIST!>B<!>
|
||||
@@ -1,12 +1,12 @@
|
||||
open class Required
|
||||
|
||||
trait A : Required
|
||||
trait A : <!TRAIT_WITH_SUPERCLASS!>Required<!>
|
||||
|
||||
trait B : A, Required
|
||||
trait B : A, <!TRAIT_WITH_SUPERCLASS!>Required<!>
|
||||
|
||||
trait C : Required
|
||||
trait C : <!TRAIT_WITH_SUPERCLASS!>Required<!>
|
||||
|
||||
trait D : B, Required
|
||||
trait D : B, <!TRAIT_WITH_SUPERCLASS!>Required<!>
|
||||
|
||||
<!UNMET_TRAIT_REQUIREMENT, UNMET_TRAIT_REQUIREMENT, UNMET_TRAIT_REQUIREMENT!>class W<!> : D
|
||||
class X : D, Required()
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
open class RequiredBase
|
||||
|
||||
trait Trait : RequiredBase
|
||||
trait Trait : <!TRAIT_WITH_SUPERCLASS!>RequiredBase<!>
|
||||
|
||||
open class RequiredDerived : RequiredBase()
|
||||
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
open class Required(val value: String)
|
||||
|
||||
trait First : Required
|
||||
trait First : <!TRAIT_WITH_SUPERCLASS!>Required<!>
|
||||
|
||||
trait Second : First
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
trait AnyTrait : Any
|
||||
trait AnyTrait : <!TRAIT_WITH_SUPERCLASS!>Any<!>
|
||||
|
||||
class Foo : AnyTrait
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
open class bar()
|
||||
|
||||
trait Foo<!CONSTRUCTOR_IN_TRAIT!>()<!> : bar<!SUPERTYPE_INITIALIZED_IN_TRAIT!>()<!>, <!MANY_CLASSES_IN_SUPERTYPE_LIST, SUPERTYPE_APPEARS_TWICE!>bar<!>, <!MANY_CLASSES_IN_SUPERTYPE_LIST, SUPERTYPE_APPEARS_TWICE!>bar<!> {
|
||||
trait Foo<!CONSTRUCTOR_IN_TRAIT!>()<!> : <!TRAIT_WITH_SUPERCLASS!>bar<!><!SUPERTYPE_INITIALIZED_IN_TRAIT!>()<!>, <!MANY_CLASSES_IN_SUPERTYPE_LIST, SUPERTYPE_APPEARS_TWICE!>bar<!>, <!MANY_CLASSES_IN_SUPERTYPE_LIST, SUPERTYPE_APPEARS_TWICE!>bar<!> {
|
||||
}
|
||||
|
||||
trait Foo2 : bar, Foo {
|
||||
trait Foo2 : <!TRAIT_WITH_SUPERCLASS!>bar<!>, Foo {
|
||||
}
|
||||
|
||||
open class Foo1() : bar(), <!SUPERTYPE_NOT_INITIALIZED, MANY_CLASSES_IN_SUPERTYPE_LIST, SUPERTYPE_APPEARS_TWICE!>bar<!>, Foo, <!SUPERTYPE_APPEARS_TWICE!>Foo<!><!NO_CONSTRUCTOR!>()<!> {}
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
open class Generic<T>
|
||||
|
||||
trait A : Generic<String>
|
||||
trait A : <!TRAIT_WITH_SUPERCLASS!>Generic<String><!>
|
||||
|
||||
trait B : Generic<Int>
|
||||
trait B : <!TRAIT_WITH_SUPERCLASS!>Generic<Int><!>
|
||||
|
||||
trait C : <!INCONSISTENT_TYPE_PARAMETER_VALUES!>A, B<!>
|
||||
|
||||
@@ -24,11 +24,11 @@ trait T2<T> {}
|
||||
trait Test<error>()</error> {
|
||||
}
|
||||
|
||||
trait Test1 : C2<error>()</error> {}
|
||||
trait Test1 : <warning>C2</warning><error>()</error> {}
|
||||
|
||||
trait Test2 : C2 {}
|
||||
trait Test2 : <warning>C2</warning> {}
|
||||
|
||||
trait Test3 : C2, <error>C3</error> {}
|
||||
trait Test3 : <warning>C2</warning>, <error>C3</error> {}
|
||||
|
||||
trait Test4 : T1 {}
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
open class bar()
|
||||
|
||||
trait Foo<error>()</error> : bar<error>()</error>, <error>bar</error>, <error>bar</error> {
|
||||
trait Foo<error>()</error> : <warning>bar</warning><error>()</error>, <error><error>bar</error></error>, <error><error>bar</error></error> {
|
||||
}
|
||||
|
||||
trait Foo2 : bar, Foo {
|
||||
trait Foo2 : <warning>bar</warning>, Foo {
|
||||
}
|
||||
|
||||
open class Foo1() : bar(), <error>bar</error>, Foo, <error>Foo</error><error>()</error> {}
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
open class Base {
|
||||
}
|
||||
|
||||
trait Derived: Base {
|
||||
trait Derived: <warning>Base</warning> {
|
||||
fun foo() {
|
||||
f1(this@Derived)
|
||||
}
|
||||
}
|
||||
|
||||
<error descr="[UNMET_TRAIT_REQUIREMENT] Super trait 'Derived' requires subclasses to extend 'Base'">class DerivedImpl</error>(): Derived {}
|
||||
<error descr="[UNMET_TRAIT_REQUIREMENT] Super trait 'Derived' requires subclasses to extend 'Base'">object ObjectImpl</error>: Derived {}
|
||||
<error>class DerivedImpl</error>(): Derived {}
|
||||
<error>object ObjectImpl</error>: Derived {}
|
||||
|
||||
fun f1(b: Base) = b
|
||||
|
||||
|
||||
Reference in New Issue
Block a user