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<JetDelegatorByExpressionSpecifier> DELEGATION_IN_TRAIT = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<PsiElement> TRAIT_WITH_SUPERCLASS = DiagnosticFactory0.create(WARNING);
DiagnosticFactory2<JetNamedDeclaration, ClassDescriptor, ClassDescriptor> UNMET_TRAIT_REQUIREMENT = DiagnosticFactory2<JetNamedDeclaration, ClassDescriptor, ClassDescriptor> UNMET_TRAIT_REQUIREMENT =
DiagnosticFactory2.create(ERROR, PositioningStrategies.DECLARATION_NAME); 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(SUPERTYPE_INITIALIZED_IN_TRAIT, "Traits cannot initialize supertypes");
MAP.put(CLASS_IN_SUPERTYPE_FOR_ENUM, "Enum class cannot inherit from classes"); 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(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(SUPERTYPE_APPEARS_TWICE, "A supertype appears twice");
MAP.put(FINAL_SUPERTYPE, "This type is final, so it cannot be inherited from"); MAP.put(FINAL_SUPERTYPE, "This type is final, so it cannot be inherited from");
MAP.put(SINGLETON_IN_SUPERTYPE, "Cannot inherit from a singleton"); MAP.put(SINGLETON_IN_SUPERTYPE, "Cannot inherit from a singleton");
@@ -416,6 +416,10 @@ public class BodyResolver {
if (supertypeOwner.getKind() == ClassKind.ENUM_CLASS) { if (supertypeOwner.getKind() == ClassKind.ENUM_CLASS) {
trace.report(CLASS_IN_SUPERTYPE_FOR_ENUM.on(typeReference)); 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) { if (classAppeared) {
trace.report(MANY_CLASSES_IN_SUPERTYPE_LIST.on(typeReference)); trace.report(MANY_CLASSES_IN_SUPERTYPE_LIST.on(typeReference));
} }
@@ -1,8 +1,8 @@
open class Base() { trait Base {
fun f() = 1 fun f() = 1
} }
open class Left() : Base() open class Left() : Base
trait Right : Base trait Right : Base
@@ -1,9 +1,8 @@
package package
internal open class Base { internal trait Base {
public constructor Base()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean 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 hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
} }
@@ -11,7 +10,7 @@ internal open class Base {
internal final class Diamond : Left, Right { internal final class Diamond : Left, Right {
public constructor Diamond() public constructor Diamond()
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean 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 hashCode(): kotlin.Int
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String 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 { internal open class Left : Base {
public constructor Left() public constructor Left()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean 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 hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
} }
internal trait Right : Base { internal trait Right : Base {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean 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 hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
} }
@@ -1,8 +1,8 @@
open class Base<P>() { trait Base<P> {
fun f() = 1 fun f() = 1
} }
open class Left<P>() : Base<P>() open class Left<P>() : Base<P>
trait Right<P> : Base<P> trait Right<P> : Base<P>
@@ -1,9 +1,8 @@
package package
internal open class Base</*0*/ P> { internal trait Base</*0*/ P> {
public constructor Base</*0*/ P>()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean 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 hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String 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> { internal final class Diamond</*0*/ P> : Left<P>, Right<P> {
public constructor Diamond</*0*/ P>() public constructor Diamond</*0*/ P>()
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean 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 hashCode(): kotlin.Int
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String 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> { internal open class Left</*0*/ P> : Base<P> {
public constructor Left</*0*/ P>() public constructor Left</*0*/ P>()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean 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 hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
} }
internal trait Right</*0*/ P> : Base<P> { internal trait Right</*0*/ P> : Base<P> {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean 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 hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
} }
@@ -1,9 +1,10 @@
trait Base {
open class Base() { var v : Int
var v : Int = 0 get() = 1
set(v) {}
} }
open class Left() : Base() open class Left() : Base
trait Right : Base trait Right : Base
@@ -1,8 +1,7 @@
package package
internal open class Base { internal trait Base {
public constructor Base() internal open var v: kotlin.Int
internal final 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 equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
@@ -10,7 +9,7 @@ internal open class Base {
internal final class Diamond : Left, Right { internal final class Diamond : Left, Right {
public constructor Diamond() 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 equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String 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 { internal open class Left : Base {
public constructor Left() 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 equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
} }
internal trait Right : Base { 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 equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
@@ -24,17 +24,17 @@ trait T2<T> {}
trait Test<!CONSTRUCTOR_IN_TRAIT!>()<!> { 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 Test4 : T1 {}
trait Test5 : T1, <!SUPERTYPE_APPEARS_TWICE!>T1<!> {} trait Test5 : T1, <!SUPERTYPE_APPEARS_TWICE!>T1<!> {}
trait Test6 : <!FINAL_SUPERTYPE!>C1<!> {} trait Test6 : <!TRAIT_WITH_SUPERCLASS, FINAL_SUPERTYPE!>C1<!> {}
class CTest1() : OC1() {} 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 override fun toString(): String
public override fun finalize() public override fun finalize()
public <!OVERRIDING_FINAL_MEMBER!>override<!> fun wait() public <!OVERRIDING_FINAL_MEMBER!>override<!> fun wait()
@@ -2,6 +2,6 @@ open class C {
val x = 1 val x = 1
} }
trait Tr : C { trait Tr : <!TRAIT_WITH_SUPERCLASS!>C<!> {
<!ACCIDENTAL_OVERRIDE!>fun getX()<!> = 1 <!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 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 equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
@@ -6,6 +6,6 @@ open class Bbb() : Aaa() {
override fun foo() = 2 override fun foo() = 2
} }
trait Ccc : Aaa trait Ccc : <!TRAIT_WITH_SUPERCLASS!>Aaa<!>
class Ddd() : Bbb(), Ccc class Ddd() : Bbb(), Ccc
@@ -4,7 +4,7 @@ open class AL {
fun get(i : Int) : Any? = i fun get(i : Int) : Any? = i
} }
trait ALE<T> : AL { trait ALE<T> : <!TRAIT_WITH_SUPERCLASS!>AL<!> {
fun getOrNull(index: Int, value: T) : T { fun getOrNull(index: Int, value: T) : T {
return <!UNCHECKED_CAST!>get(index) as? T<!> ?: value return <!UNCHECKED_CAST!>get(index) as? T<!> ?: value
} }
@@ -2,7 +2,7 @@ open class A {
open fun foo() {} open fun foo() {}
} }
trait ATrait : A { trait ATrait : <!TRAIT_WITH_SUPERCLASS!>A<!> {
override fun foo() { override fun foo() {
<!SUPERCLASS_NOT_ACCESSIBLE_FROM_TRAIT!>super<A><!>.foo() <!SUPERCLASS_NOT_ACCESSIBLE_FROM_TRAIT!>super<A><!>.foo()
@@ -1,6 +1,6 @@
open class Required open class Required
trait Trait : Required trait Trait : <!TRAIT_WITH_SUPERCLASS!>Required<!>
abstract <!UNMET_TRAIT_REQUIREMENT!>class Abstract<!> : Trait abstract <!UNMET_TRAIT_REQUIREMENT!>class Abstract<!> : Trait
@@ -1,6 +1,6 @@
open class Required open class Required
trait A : Required trait A : <!TRAIT_WITH_SUPERCLASS!>Required<!>
val a = <!UNMET_TRAIT_REQUIREMENT!>object<!> : A {} val a = <!UNMET_TRAIT_REQUIREMENT!>object<!> : A {}
val b: A = object : A, Required() {} val b: A = object : A, Required() {}
@@ -1,8 +1,8 @@
open class Generic<T> 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<!> <!UNMET_TRAIT_REQUIREMENT, UNMET_TRAIT_REQUIREMENT!>class Y<!> : <!INCONSISTENT_TYPE_PARAMETER_VALUES!>A, B<!>
class Z : <!INCONSISTENT_TYPE_PARAMETER_VALUES!>A, B, Generic<Int>()<!> class Z : <!INCONSISTENT_TYPE_PARAMETER_VALUES!>A, B, Generic<Int>()<!>
@@ -1,7 +1,7 @@
open class Base { open class Base {
} }
trait Derived: Base { trait Derived: <!TRAIT_WITH_SUPERCLASS!>Base<!> {
fun foo() { fun foo() {
f1(this@Derived) f1(this@Derived)
} }
@@ -1,4 +1,4 @@
open class A open class A
open class B 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 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 <!UNMET_TRAIT_REQUIREMENT, UNMET_TRAIT_REQUIREMENT, UNMET_TRAIT_REQUIREMENT!>class W<!> : D
class X : D, Required() class X : D, Required()
@@ -1,6 +1,6 @@
open class RequiredBase open class RequiredBase
trait Trait : RequiredBase trait Trait : <!TRAIT_WITH_SUPERCLASS!>RequiredBase<!>
open class RequiredDerived : RequiredBase() open class RequiredDerived : RequiredBase()
@@ -1,6 +1,6 @@
open class Required(val value: String) open class Required(val value: String)
trait First : Required trait First : <!TRAIT_WITH_SUPERCLASS!>Required<!>
trait Second : First trait Second : First
@@ -1,4 +1,4 @@
trait AnyTrait : Any trait AnyTrait : <!TRAIT_WITH_SUPERCLASS!>Any<!>
class Foo : AnyTrait class Foo : AnyTrait
@@ -1,9 +1,9 @@
open class bar() 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!>()<!> {} 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> 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<!> trait C : <!INCONSISTENT_TYPE_PARAMETER_VALUES!>A, B<!>
+3 -3
View File
@@ -24,11 +24,11 @@ trait T2<T> {}
trait Test<error>()</error> { 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 {} trait Test4 : T1 {}
+2 -2
View File
@@ -1,9 +1,9 @@
open class bar() 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> {} open class Foo1() : bar(), <error>bar</error>, Foo, <error>Foo</error><error>()</error> {}
@@ -1,14 +1,14 @@
open class Base { open class Base {
} }
trait Derived: Base { trait Derived: <warning>Base</warning> {
fun foo() { fun foo() {
f1(this@Derived) f1(this@Derived)
} }
} }
<error descr="[UNMET_TRAIT_REQUIREMENT] Super trait 'Derived' requires subclasses to extend 'Base'">class DerivedImpl</error>(): Derived {} <error>class DerivedImpl</error>(): Derived {}
<error descr="[UNMET_TRAIT_REQUIREMENT] Super trait 'Derived' requires subclasses to extend 'Base'">object ObjectImpl</error>: Derived {} <error>object ObjectImpl</error>: Derived {}
fun f1(b: Base) = b fun f1(b: Base) = b