KT-5963 Call to super shouldn't require type specification if there is no conflict
Implemented unqualified 'super' type resolution (in BasicExpressionTypingVisitor). No overload resolution of any kind is involved. Corresponding supertype is determined by the expected member name only: - 'super.foo(...)' - function or property (of possibly callable type) 'foo' - 'super.x' - property 'x' Supertype should provide a non-abstract implementation of such member. As a fall-back solution for diagnostics purposes, consider supertypes with abstract implementation of such member. Diagnostics: - AMBIGUOUS_SUPER on 'super', if multiple possible supertypes are available; - ABSTRACT_SUPER_CALL on selector expression, if the only available implementation is abstract. #KT-5963 Fixed
This commit is contained in:
@@ -12,7 +12,7 @@ class A<E>() : C(), T {
|
||||
fun test() {
|
||||
<!SUPER_IS_NOT_AN_EXPRESSION!>super<!>
|
||||
<!SUPER_IS_NOT_AN_EXPRESSION!>super<T><!>
|
||||
<!AMBIGUOUS_SUPER!>super<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>foo<!>()
|
||||
super.foo()
|
||||
super<T>.foo()
|
||||
super<C>.bar()
|
||||
super<T>@A.foo()
|
||||
|
||||
Vendored
+37
@@ -0,0 +1,37 @@
|
||||
open class GenericBaseClass<T> {
|
||||
open fun foo(x: T): T = x
|
||||
open fun ambiguous(x: T): T = x
|
||||
}
|
||||
|
||||
interface GenericBaseInterface<T> {
|
||||
fun bar(x: T): T = x
|
||||
fun ambiguous(x: T): T = x
|
||||
}
|
||||
|
||||
class GenericDerivedClass<T> : GenericBaseClass<T>(), GenericBaseInterface<T> {
|
||||
override fun foo(x: T): T = super.foo(x)
|
||||
override fun bar(x: T): T = super.bar(x)
|
||||
|
||||
override fun ambiguous(x: T): T =
|
||||
<!AMBIGUOUS_SUPER!>super<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>ambiguous<!>(x)
|
||||
}
|
||||
|
||||
class <!CONFLICTING_JVM_DECLARATIONS!>SpecializedDerivedClass<!> : GenericBaseClass<Int>(), GenericBaseInterface<String> {
|
||||
override fun foo(x: Int): Int = super.foo(x)
|
||||
override fun bar(x: String): String = super.bar(x)
|
||||
|
||||
override fun ambiguous(x: String): String =
|
||||
<!AMBIGUOUS_SUPER!>super<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>ambiguous<!>(x)
|
||||
override fun ambiguous(x: Int): Int =
|
||||
<!AMBIGUOUS_SUPER!>super<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>ambiguous<!>(x)
|
||||
}
|
||||
|
||||
class <!CONFLICTING_JVM_DECLARATIONS!>MixedDerivedClass<!><T> : GenericBaseClass<Int>(), GenericBaseInterface<T> {
|
||||
override fun foo(x: Int): Int = super.foo(x)
|
||||
override fun bar(x: T): T = super.bar(x)
|
||||
|
||||
override fun ambiguous(x: Int): Int =
|
||||
<!AMBIGUOUS_SUPER!>super<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>ambiguous<!>(x)
|
||||
<!CONFLICTING_JVM_DECLARATIONS!>override fun ambiguous(x: T): T<!> =
|
||||
<!AMBIGUOUS_SUPER!>super<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>ambiguous<!>(x)
|
||||
}
|
||||
Vendored
+50
@@ -0,0 +1,50 @@
|
||||
package
|
||||
|
||||
internal open class GenericBaseClass</*0*/ T> {
|
||||
public constructor GenericBaseClass</*0*/ T>()
|
||||
internal open fun ambiguous(/*0*/ x: T): T
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open fun foo(/*0*/ x: T): T
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal interface GenericBaseInterface</*0*/ T> {
|
||||
internal open fun ambiguous(/*0*/ x: T): T
|
||||
internal open fun bar(/*0*/ x: T): T
|
||||
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 final class GenericDerivedClass</*0*/ T> : GenericBaseClass<T>, GenericBaseInterface<T> {
|
||||
public constructor GenericDerivedClass</*0*/ T>()
|
||||
internal open override /*2*/ fun ambiguous(/*0*/ x: T): T
|
||||
internal open override /*1*/ fun bar(/*0*/ x: T): T
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open override /*1*/ fun foo(/*0*/ x: T): T
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal final class MixedDerivedClass</*0*/ T> : GenericBaseClass<kotlin.Int>, GenericBaseInterface<T> {
|
||||
public constructor MixedDerivedClass</*0*/ T>()
|
||||
internal open override /*1*/ fun ambiguous(/*0*/ x: T): T
|
||||
internal open override /*1*/ fun ambiguous(/*0*/ x: kotlin.Int): kotlin.Int
|
||||
internal open override /*1*/ fun bar(/*0*/ x: T): T
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open override /*1*/ fun foo(/*0*/ x: kotlin.Int): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal final class SpecializedDerivedClass : GenericBaseClass<kotlin.Int>, GenericBaseInterface<kotlin.String> {
|
||||
public constructor SpecializedDerivedClass()
|
||||
internal open override /*1*/ fun ambiguous(/*0*/ x: kotlin.Int): kotlin.Int
|
||||
internal open override /*1*/ fun ambiguous(/*0*/ x: kotlin.String): kotlin.String
|
||||
internal open override /*1*/ fun bar(/*0*/ x: kotlin.String): kotlin.String
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open override /*1*/ fun foo(/*0*/ x: kotlin.Int): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
// Base Interface
|
||||
// \ /
|
||||
// \/
|
||||
// Derived
|
||||
//
|
||||
|
||||
open class Base() {
|
||||
open fun foo() {}
|
||||
|
||||
open fun ambiguous() {}
|
||||
|
||||
open val prop: Int
|
||||
get() = 1234
|
||||
|
||||
open val ambiguousProp: Int
|
||||
get() = 111
|
||||
}
|
||||
|
||||
interface Interface {
|
||||
fun bar() {}
|
||||
|
||||
fun ambiguous() {}
|
||||
|
||||
val ambiguousProp: Int
|
||||
get() = 222
|
||||
}
|
||||
|
||||
class Derived : Base(), Interface {
|
||||
override fun foo() {}
|
||||
override fun bar() {}
|
||||
|
||||
override fun ambiguous() {}
|
||||
|
||||
override val ambiguousProp: Int
|
||||
get() = 333
|
||||
|
||||
override val prop: Int
|
||||
get() = 4321
|
||||
|
||||
fun callsFunFromSuperClass() {
|
||||
super.foo()
|
||||
}
|
||||
|
||||
fun getSuperProp(): Int =
|
||||
super.prop
|
||||
|
||||
fun getAmbiguousSuperProp(): Int =
|
||||
<!AMBIGUOUS_SUPER!>super<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>ambiguousProp<!>
|
||||
|
||||
fun callsFunFromSuperInterface() {
|
||||
super.bar()
|
||||
}
|
||||
|
||||
fun callsAmbiguousSuperFun() {
|
||||
<!AMBIGUOUS_SUPER!>super<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>ambiguous<!>()
|
||||
}
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
package
|
||||
|
||||
internal open class Base {
|
||||
public constructor Base()
|
||||
internal open val ambiguousProp: kotlin.Int
|
||||
internal open val prop: kotlin.Int
|
||||
internal open fun ambiguous(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open fun foo(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal final class Derived : Base, Interface {
|
||||
public constructor Derived()
|
||||
internal open override /*2*/ val ambiguousProp: kotlin.Int
|
||||
internal open override /*1*/ val prop: kotlin.Int
|
||||
internal open override /*2*/ fun ambiguous(): kotlin.Unit
|
||||
internal open override /*1*/ fun bar(): kotlin.Unit
|
||||
internal final fun callsAmbiguousSuperFun(): kotlin.Unit
|
||||
internal final fun callsFunFromSuperClass(): kotlin.Unit
|
||||
internal final fun callsFunFromSuperInterface(): kotlin.Unit
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open override /*1*/ fun foo(): kotlin.Unit
|
||||
internal final fun getAmbiguousSuperProp(): kotlin.Int
|
||||
internal final fun getSuperProp(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal interface Interface {
|
||||
internal open val ambiguousProp: kotlin.Int
|
||||
internal open fun ambiguous(): kotlin.Unit
|
||||
internal open fun bar(): kotlin.Unit
|
||||
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
|
||||
}
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
// fun foo: abstract in A, unresolved in I
|
||||
// fun bar: implemented in A, abstract in I
|
||||
// fun qux: abstract in A, abstract in I
|
||||
// val x: unresolved in A, abstract in I
|
||||
// val y: abstract in A, implemented in I
|
||||
|
||||
abstract class A {
|
||||
abstract fun foo(): Int
|
||||
open fun bar() {}
|
||||
abstract fun qux()
|
||||
|
||||
abstract val y: Int
|
||||
}
|
||||
|
||||
interface I {
|
||||
fun bar()
|
||||
fun qux()
|
||||
|
||||
val x: Int
|
||||
val y: Int get() = 111
|
||||
}
|
||||
|
||||
class B : A(), I {
|
||||
override val x: Int = 12345
|
||||
override val y: Int = super.y
|
||||
|
||||
override fun foo(): Int {
|
||||
super.<!ABSTRACT_SUPER_CALL!>foo<!>()
|
||||
return super.<!ABSTRACT_SUPER_CALL!>x<!>
|
||||
}
|
||||
|
||||
override fun bar() {
|
||||
super.bar()
|
||||
}
|
||||
|
||||
override fun qux() {
|
||||
<!AMBIGUOUS_SUPER!>super<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>qux<!>()
|
||||
}
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
package
|
||||
|
||||
internal abstract class A {
|
||||
public constructor A()
|
||||
internal abstract val y: kotlin.Int
|
||||
internal open fun bar(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal abstract fun foo(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
internal abstract fun qux(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal final class B : A, I {
|
||||
public constructor B()
|
||||
internal open override /*1*/ val x: kotlin.Int = 12345
|
||||
internal open override /*2*/ val y: kotlin.Int
|
||||
internal open override /*2*/ fun bar(): kotlin.Unit
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open override /*1*/ fun foo(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
internal open override /*2*/ fun qux(): kotlin.Unit
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal interface I {
|
||||
internal abstract val x: kotlin.Int
|
||||
internal open val y: kotlin.Int
|
||||
internal abstract fun bar(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
internal abstract fun qux(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
// Ambiguity between fun and callable property
|
||||
|
||||
open class BaseWithCallableProp {
|
||||
val fn = { "fn.invoke()" }
|
||||
|
||||
val bar = { "bar.invoke()"}
|
||||
open fun bar(): String = "bar()"
|
||||
}
|
||||
|
||||
interface InterfaceWithFun {
|
||||
fun fn(): String = "fn()"
|
||||
}
|
||||
|
||||
class DerivedUsingFun : BaseWithCallableProp(), InterfaceWithFun {
|
||||
fun foo(): String =
|
||||
<!AMBIGUOUS_SUPER!>super<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>fn<!>()
|
||||
|
||||
override fun bar(): String =
|
||||
super.bar()
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
package
|
||||
|
||||
internal open class BaseWithCallableProp {
|
||||
public constructor BaseWithCallableProp()
|
||||
internal final val bar: () -> kotlin.String
|
||||
internal final val fn: () -> kotlin.String
|
||||
internal open fun bar(): 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
|
||||
}
|
||||
|
||||
internal final class DerivedUsingFun : BaseWithCallableProp, InterfaceWithFun {
|
||||
public constructor DerivedUsingFun()
|
||||
internal final override /*1*/ /*fake_override*/ val bar: () -> kotlin.String
|
||||
internal final override /*1*/ /*fake_override*/ val fn: () -> kotlin.String
|
||||
internal open override /*1*/ fun bar(): kotlin.String
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open override /*1*/ /*fake_override*/ fun fn(): kotlin.String
|
||||
internal final fun foo(): kotlin.String
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal interface InterfaceWithFun {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open fun fn(): kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
// Check that it works with inherited members
|
||||
//
|
||||
// DeeperBase DeeperInterface
|
||||
// | |
|
||||
// DeepBase DeepInterface
|
||||
// \ /
|
||||
// \/
|
||||
// DeepDerived
|
||||
//
|
||||
|
||||
open class DeeperBase {
|
||||
open fun deeperBaseFun() {}
|
||||
|
||||
open val deeperBaseProp: Int
|
||||
get() = 333
|
||||
}
|
||||
|
||||
open class DeepBase : DeeperBase() {
|
||||
}
|
||||
|
||||
interface DeeperInterface {
|
||||
fun deeperInterfaceFun() {}
|
||||
}
|
||||
|
||||
interface DeepInterface : DeeperInterface {
|
||||
fun deepInterfaceFun() {}
|
||||
}
|
||||
|
||||
class DeepDerived : DeepBase(), DeepInterface {
|
||||
override fun deeperBaseFun() {}
|
||||
|
||||
override val deeperBaseProp: Int
|
||||
get() = 444
|
||||
|
||||
override fun deeperInterfaceFun() {}
|
||||
override fun deepInterfaceFun() {}
|
||||
|
||||
fun callsSuperDeeperBaseFun() {
|
||||
super.deeperBaseFun()
|
||||
}
|
||||
|
||||
fun getsSuperDeeperBaseProp(): Int =
|
||||
super.deeperBaseProp
|
||||
|
||||
fun callsSuperInterfaceFuns() {
|
||||
super.deeperInterfaceFun()
|
||||
super.deepInterfaceFun()
|
||||
super<DeepInterface>.deeperInterfaceFun()
|
||||
super<DeepInterface>.deepInterfaceFun()
|
||||
}
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
package
|
||||
|
||||
internal open class DeepBase : DeeperBase {
|
||||
public constructor DeepBase()
|
||||
internal open override /*1*/ /*fake_override*/ val deeperBaseProp: kotlin.Int
|
||||
internal open override /*1*/ /*fake_override*/ fun deeperBaseFun(): kotlin.Unit
|
||||
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 final class DeepDerived : DeepBase, DeepInterface {
|
||||
public constructor DeepDerived()
|
||||
internal open override /*1*/ val deeperBaseProp: kotlin.Int
|
||||
internal final fun callsSuperDeeperBaseFun(): kotlin.Unit
|
||||
internal final fun callsSuperInterfaceFuns(): kotlin.Unit
|
||||
internal open override /*1*/ fun deepInterfaceFun(): kotlin.Unit
|
||||
internal open override /*1*/ fun deeperBaseFun(): kotlin.Unit
|
||||
internal open override /*1*/ fun deeperInterfaceFun(): kotlin.Unit
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal final fun getsSuperDeeperBaseProp(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal interface DeepInterface : DeeperInterface {
|
||||
internal open fun deepInterfaceFun(): kotlin.Unit
|
||||
internal open override /*1*/ /*fake_override*/ fun deeperInterfaceFun(): kotlin.Unit
|
||||
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 open class DeeperBase {
|
||||
public constructor DeeperBase()
|
||||
internal open val deeperBaseProp: kotlin.Int
|
||||
internal open fun deeperBaseFun(): kotlin.Unit
|
||||
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 interface DeeperInterface {
|
||||
internal open fun deeperInterfaceFun(): kotlin.Unit
|
||||
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
|
||||
}
|
||||
Vendored
+22
@@ -0,0 +1,22 @@
|
||||
open class GenericBaseClass<T> {
|
||||
open fun foo(x: T): T = x
|
||||
}
|
||||
|
||||
interface GenericBaseInterface<T> {
|
||||
fun bar(x: T): T = x
|
||||
}
|
||||
|
||||
class GenericDerivedClass<T> : GenericBaseClass<T>(), GenericBaseInterface<T> {
|
||||
override fun foo(x: T): T = super.foo(x)
|
||||
override fun bar(x: T): T = super.bar(x)
|
||||
}
|
||||
|
||||
class SpecializedDerivedClass : GenericBaseClass<Int>(), GenericBaseInterface<String> {
|
||||
override fun foo(x: Int): Int = super.foo(x)
|
||||
override fun bar(x: String): String = super.bar(x)
|
||||
}
|
||||
|
||||
class MixedDerivedClass<T> : GenericBaseClass<Int>(), GenericBaseInterface<T> {
|
||||
override fun foo(x: Int): Int = super.foo(x)
|
||||
override fun bar(x: T): T = super.bar(x)
|
||||
}
|
||||
Vendored
+43
@@ -0,0 +1,43 @@
|
||||
package
|
||||
|
||||
internal open class GenericBaseClass</*0*/ T> {
|
||||
public constructor GenericBaseClass</*0*/ T>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open fun foo(/*0*/ x: T): T
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal interface GenericBaseInterface</*0*/ T> {
|
||||
internal open fun bar(/*0*/ x: T): T
|
||||
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 final class GenericDerivedClass</*0*/ T> : GenericBaseClass<T>, GenericBaseInterface<T> {
|
||||
public constructor GenericDerivedClass</*0*/ T>()
|
||||
internal open override /*1*/ fun bar(/*0*/ x: T): T
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open override /*1*/ fun foo(/*0*/ x: T): T
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal final class MixedDerivedClass</*0*/ T> : GenericBaseClass<kotlin.Int>, GenericBaseInterface<T> {
|
||||
public constructor MixedDerivedClass</*0*/ T>()
|
||||
internal open override /*1*/ fun bar(/*0*/ x: T): T
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open override /*1*/ fun foo(/*0*/ x: kotlin.Int): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal final class SpecializedDerivedClass : GenericBaseClass<kotlin.Int>, GenericBaseInterface<kotlin.String> {
|
||||
public constructor SpecializedDerivedClass()
|
||||
internal open override /*1*/ fun bar(/*0*/ x: kotlin.String): kotlin.String
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open override /*1*/ fun foo(/*0*/ x: kotlin.Int): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
Vendored
+33
@@ -0,0 +1,33 @@
|
||||
open class A {
|
||||
open fun foo() {}
|
||||
}
|
||||
|
||||
interface B {
|
||||
fun bar() {}
|
||||
}
|
||||
|
||||
interface Q {
|
||||
fun qux() {}
|
||||
}
|
||||
|
||||
class C : A(), B {
|
||||
override fun foo() {
|
||||
super@C.foo()
|
||||
}
|
||||
|
||||
override fun bar() {
|
||||
super@C.bar()
|
||||
}
|
||||
|
||||
inner class D : A(), Q {
|
||||
override fun foo() {
|
||||
super@C.foo()
|
||||
super@D.foo()
|
||||
}
|
||||
|
||||
override fun qux() {
|
||||
super@C.<!UNRESOLVED_REFERENCE!>qux<!>()
|
||||
super@D.qux()
|
||||
}
|
||||
}
|
||||
}
|
||||
compiler/testData/diagnostics/tests/thisAndSuper/unqualifiedSuper/unqualifiedSuperWithInnerClass.txt
Vendored
+41
@@ -0,0 +1,41 @@
|
||||
package
|
||||
|
||||
internal open class A {
|
||||
public constructor A()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open fun foo(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal interface B {
|
||||
internal open fun bar(): kotlin.Unit
|
||||
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 final class C : A, B {
|
||||
public constructor C()
|
||||
internal open override /*1*/ fun bar(): kotlin.Unit
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open override /*1*/ fun foo(): kotlin.Unit
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
internal final inner class D : A, Q {
|
||||
public constructor D()
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open override /*1*/ fun foo(): kotlin.Unit
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
internal open override /*1*/ fun qux(): kotlin.Unit
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
}
|
||||
|
||||
internal interface Q {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
internal open fun qux(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
Vendored
+28
@@ -0,0 +1,28 @@
|
||||
// Interface AnotherInterface
|
||||
// \ /
|
||||
// \/
|
||||
// DerivedInterface
|
||||
//
|
||||
|
||||
interface Interface {
|
||||
fun foo() {}
|
||||
fun ambiguous() {}
|
||||
val ambiguousProp: Int
|
||||
get() = 222
|
||||
}
|
||||
|
||||
interface AnotherInterface {
|
||||
fun ambiguous() {}
|
||||
val ambiguousProp: Int
|
||||
get() = 333
|
||||
}
|
||||
|
||||
interface DerivedInterface: Interface, AnotherInterface {
|
||||
override fun foo() { super.foo() }
|
||||
override fun ambiguous() {
|
||||
<!AMBIGUOUS_SUPER!>super<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>ambiguous<!>()
|
||||
}
|
||||
override val ambiguousProp: Int
|
||||
get() = <!AMBIGUOUS_SUPER!>super<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>ambiguousProp<!>
|
||||
}
|
||||
|
||||
compiler/testData/diagnostics/tests/thisAndSuper/unqualifiedSuper/unqualifiedSuperWithInterfaces.txt
Vendored
+27
@@ -0,0 +1,27 @@
|
||||
package
|
||||
|
||||
internal interface AnotherInterface {
|
||||
internal open val ambiguousProp: kotlin.Int
|
||||
internal open fun ambiguous(): kotlin.Unit
|
||||
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 interface DerivedInterface : Interface, AnotherInterface {
|
||||
internal open override /*2*/ val ambiguousProp: kotlin.Int
|
||||
internal open override /*2*/ fun ambiguous(): kotlin.Unit
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open override /*1*/ fun foo(): kotlin.Unit
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal interface Interface {
|
||||
internal open val ambiguousProp: kotlin.Int
|
||||
internal open fun ambiguous(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open fun foo(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
Vendored
+21
@@ -0,0 +1,21 @@
|
||||
interface Interface {
|
||||
fun foo(x: Int): Int
|
||||
}
|
||||
|
||||
fun withLocalClasses(param: Int): Interface {
|
||||
open class LocalBase {
|
||||
open val param: Int
|
||||
get() = 100
|
||||
}
|
||||
|
||||
interface LocalInterface : Interface {
|
||||
override fun foo(x: Int): Int =
|
||||
x + param
|
||||
}
|
||||
|
||||
return object : LocalBase(), LocalInterface {
|
||||
override fun foo(x: Int): Int =
|
||||
x + super.param
|
||||
}
|
||||
|
||||
}
|
||||
compiler/testData/diagnostics/tests/thisAndSuper/unqualifiedSuper/unqualifiedSuperWithLocalClass.txt
Vendored
+10
@@ -0,0 +1,10 @@
|
||||
package
|
||||
|
||||
internal fun withLocalClasses(/*0*/ param: kotlin.Int): Interface
|
||||
|
||||
internal interface Interface {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal abstract fun foo(/*0*/ x: kotlin.Int): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+53
@@ -0,0 +1,53 @@
|
||||
// Check that unresolved super type doesn't interfere with unqualified super resolution.
|
||||
|
||||
open class Base() {
|
||||
open fun foo() {}
|
||||
|
||||
open fun ambiguous() {}
|
||||
|
||||
open val prop: Int
|
||||
get() = 1234
|
||||
|
||||
open val ambiguousProp: Int
|
||||
get() = 111
|
||||
}
|
||||
|
||||
interface Interface {
|
||||
fun bar() {}
|
||||
|
||||
fun ambiguous() {}
|
||||
|
||||
val ambiguousProp: Int
|
||||
get() = 222
|
||||
}
|
||||
|
||||
class ClassDerivedFromUnresolved : Base(), Interface, <!UNRESOLVED_REFERENCE!>Unresolved<!> {
|
||||
override fun foo() {}
|
||||
override fun bar() {}
|
||||
|
||||
override fun ambiguous() {}
|
||||
|
||||
override val ambiguousProp: Int
|
||||
get() = 333
|
||||
|
||||
override val prop: Int
|
||||
get() = 4321
|
||||
|
||||
fun callsFunFromSuperClass() {
|
||||
super.foo()
|
||||
}
|
||||
|
||||
fun getSuperProp(): Int =
|
||||
super.prop
|
||||
|
||||
fun getAmbiguousSuperProp(): Int =
|
||||
<!AMBIGUOUS_SUPER!>super<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>ambiguousProp<!>
|
||||
|
||||
fun callsFunFromSuperInterface() {
|
||||
super.bar()
|
||||
}
|
||||
|
||||
fun callsAmbiguousSuperFun() {
|
||||
<!AMBIGUOUS_SUPER!>super<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>ambiguous<!>()
|
||||
}
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
package
|
||||
|
||||
internal open class Base {
|
||||
public constructor Base()
|
||||
internal open val ambiguousProp: kotlin.Int
|
||||
internal open val prop: kotlin.Int
|
||||
internal open fun ambiguous(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open fun foo(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal final class ClassDerivedFromUnresolved : Base, Interface {
|
||||
public constructor ClassDerivedFromUnresolved()
|
||||
internal open override /*2*/ val ambiguousProp: kotlin.Int
|
||||
internal open override /*1*/ val prop: kotlin.Int
|
||||
internal open override /*2*/ fun ambiguous(): kotlin.Unit
|
||||
internal open override /*1*/ fun bar(): kotlin.Unit
|
||||
internal final fun callsAmbiguousSuperFun(): kotlin.Unit
|
||||
internal final fun callsFunFromSuperClass(): kotlin.Unit
|
||||
internal final fun callsFunFromSuperInterface(): kotlin.Unit
|
||||
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal open override /*1*/ fun foo(): kotlin.Unit
|
||||
internal final fun getAmbiguousSuperProp(): kotlin.Int
|
||||
internal final fun getSuperProp(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal interface Interface {
|
||||
internal open val ambiguousProp: kotlin.Int
|
||||
internal open fun ambiguous(): kotlin.Unit
|
||||
internal open fun bar(): kotlin.Unit
|
||||
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