deprecate required classes for traits

This commit is contained in:
Dmitry Jemerov
2015-04-10 18:04:45 +02:00
committed by Andrey Breslav
parent 7b0f6018dc
commit 900a16a315
31 changed files with 74 additions and 62 deletions
@@ -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);
@@ -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()
@@ -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,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,6 +1,6 @@
open class RequiredBase
trait Trait : RequiredBase
trait Trait : <!TRAIT_WITH_SUPERCLASS!>RequiredBase<!>
open class RequiredDerived : RequiredBase()
@@ -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!>()<!> {}
@@ -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<!>
+3 -3
View File
@@ -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 {}
+2 -2
View File
@@ -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