[FIR] Implement super resolve as a particular tower resolver case

This commit is contained in:
Mikhail Glukhikh
2020-01-29 12:41:45 +03:00
parent ee020ef290
commit 71b0840ef9
42 changed files with 211 additions and 71 deletions
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// IGNORE_BACKEND: JS_IR
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS, NATIVE
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM
open class A : Cloneable {
@@ -1,5 +1,4 @@
// !JVM_DEFAULT_MODE: enable
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_RUNTIME
-1
View File
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
-1
View File
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM
// WITH_RUNTIME
-1
View File
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM
// WITH_RUNTIME
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
open class A {
internal open val field = "F"
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
open class A {
internal open val field = "F"
-1
View File
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
interface Z<T> {
val value: T
@@ -2,6 +2,6 @@
enum class E : Cloneable {
A;
override fun clone(): Any {
return super.clone()
return super.<!AMBIGUITY!>clone<!>()
}
}
@@ -14,9 +14,9 @@ class C : T {
fun T.buzz() {}
fun T.buzz1() {}
super.foo() // OK
super.bar() // Error
super.<!UNRESOLVED_REFERENCE!>bar<!>() // Error
super.buzz() // OK, resolved to a member
super.buzz1() // Resolved to an extension
super.<!INAPPLICABLE_CANDIDATE!>buzz1<!>() // Resolved to an extension
super.<!INAPPLICABLE_CANDIDATE!>buzz1<!>("") // Resolved to a member
}
}
@@ -12,7 +12,7 @@ class A<E>() : C(), T {
fun test() {
super
super<T>
super.<!UNRESOLVED_REFERENCE!>foo<!>()
super.foo()
super<T>.foo()
super<C>.bar()
super<T>@A.foo()
@@ -4,6 +4,6 @@ fun Any.extension(arg: Any?) {}
class A1 {
fun test() {
super.extension(null) // Call to an extension function
super.<!UNRESOLVED_REFERENCE!>extension<!>(null) // Call to an extension function
}
}
@@ -11,28 +11,28 @@ interface GenericBaseInterface<T> {
class GenericDerivedClass<T> : GenericBaseClass<T>(), GenericBaseInterface<T> {
override fun foo(x: T): T = super.foo(x)
override fun bar(x: T): T = super.<!UNRESOLVED_REFERENCE!>bar<!>(x)
override fun bar(x: T): T = super.bar(x)
override fun ambiguous(x: T): T =
super.ambiguous(x)
super.<!AMBIGUITY!>ambiguous<!>(x)
}
class SpecializedDerivedClass : GenericBaseClass<Int>(), GenericBaseInterface<String> {
override fun foo(x: Int): Int = super.foo(x)
override fun bar(x: String): String = super.<!UNRESOLVED_REFERENCE!>bar<!>(x)
override fun bar(x: String): String = super.bar(x)
override fun ambiguous(x: String): String =
super.<!INAPPLICABLE_CANDIDATE!>ambiguous<!>(x)
super.ambiguous(x)
override fun ambiguous(x: Int): Int =
super.ambiguous(x)
}
class MixedDerivedClass<T> : GenericBaseClass<Int>(), GenericBaseInterface<T> {
override fun foo(x: Int): Int = super.foo(x)
override fun bar(x: T): T = super.<!UNRESOLVED_REFERENCE!>bar<!>(x)
override fun bar(x: T): T = super.bar(x)
override fun ambiguous(x: Int): Int =
super.ambiguous(x)
override fun ambiguous(x: T): T =
super.<!INAPPLICABLE_CANDIDATE!>ambiguous<!>(x)
super.ambiguous(x)
}
@@ -45,13 +45,13 @@ class Derived : Base(), Interface {
super.prop
fun getAmbiguousSuperProp(): Int =
super.ambiguousProp
super.<!AMBIGUITY!>ambiguousProp<!>
fun callsFunFromSuperInterface() {
super.<!UNRESOLVED_REFERENCE!>bar<!>()
super.bar()
}
fun callsAmbiguousSuperFun() {
super.ambiguous()
super.<!AMBIGUITY!>ambiguous<!>()
}
}
@@ -22,18 +22,18 @@ interface I {
class B : A(), I {
override val x: Int = 12345
override val y: Int = super.y
override val y: Int = super.<!AMBIGUITY!>y<!>
override fun foo(): Int {
super.foo()
return super.<!UNRESOLVED_REFERENCE!>x<!>
return super.x
}
override fun bar() {
super.bar()
super.<!AMBIGUITY!>bar<!>()
}
override fun qux() {
super.qux()
super.<!AMBIGUITY!>qux<!>()
}
}
@@ -43,8 +43,8 @@ class DeepDerived : DeepBase(), DeepInterface {
super.deeperBaseProp
fun callsSuperInterfaceFuns() {
super.<!UNRESOLVED_REFERENCE!>deeperInterfaceFun<!>()
super.<!UNRESOLVED_REFERENCE!>deepInterfaceFun<!>()
super.deeperInterfaceFun()
super.deepInterfaceFun()
super<DeepInterface>.deeperInterfaceFun()
super<DeepInterface>.deepInterfaceFun()
}
@@ -8,15 +8,15 @@ interface GenericBaseInterface<T> {
class GenericDerivedClass<T> : GenericBaseClass<T>(), GenericBaseInterface<T> {
override fun foo(x: T): T = super.foo(x)
override fun bar(x: T): T = super.<!UNRESOLVED_REFERENCE!>bar<!>(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.<!UNRESOLVED_REFERENCE!>bar<!>(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.<!UNRESOLVED_REFERENCE!>bar<!>(x)
override fun bar(x: T): T = super.bar(x)
}
@@ -16,7 +16,7 @@ class C : A(), B {
}
override fun bar() {
super@C.<!UNRESOLVED_REFERENCE!>bar<!>()
super@C.bar()
}
inner class D : A(), Q {
@@ -26,8 +26,8 @@ class C : A(), B {
}
override fun qux() {
super@C.<!UNRESOLVED_REFERENCE!>qux<!>()
super@D.<!UNRESOLVED_REFERENCE!>qux<!>()
super@C.qux()
super@D.qux()
}
}
}
@@ -20,9 +20,9 @@ interface AnotherInterface {
interface DerivedInterface: Interface, AnotherInterface {
override fun foo() { super.foo() }
override fun ambiguous() {
super.ambiguous()
super.<!AMBIGUITY!>ambiguous<!>()
}
override val ambiguousProp: Int
get() = super.ambiguousProp
get() = super.<!AMBIGUITY!>ambiguousProp<!>
}
@@ -41,13 +41,13 @@ class ClassDerivedFromUnresolved : Base(), Interface, Unresolved {
super.prop
fun getAmbiguousSuperProp(): Int =
super.ambiguousProp
super.<!AMBIGUITY!>ambiguousProp<!>
fun callsFunFromSuperInterface() {
super.<!UNRESOLVED_REFERENCE!>bar<!>()
super.bar()
}
fun callsAmbiguousSuperFun() {
super.ambiguous()
super.<!AMBIGUITY!>ambiguous<!>()
}
}
@@ -15,7 +15,7 @@ class Test1 : C(), A {
// Abstract 'foo' defined in 'C' wins against non-abstract 'foo' defined in 'A',
// because 'C' is a subclass of 'A' (and 'C::foo' overrides 'A::foo'),
// even though 'A' is explicitly listed in supertypes list for 'D'.
super.foo()
super.<!AMBIGUITY!>foo<!>()
}
}
@@ -23,7 +23,7 @@ class Test2 : C(), A, Unrelated {
override fun foo() {
// This is ok, because there's a non-abstract 'foo' in 'Unrelated',
// which is not overridden by abstract 'foo' in 'C'.
super.foo()
super.<!AMBIGUITY!>foo<!>()
super<Unrelated>.foo()
}
}
@@ -49,7 +49,7 @@ class ManySupers2: Foo2(), C {
fun foo() {
super<Foo2>.test()
super<C>.test()
super.test()
super.<!AMBIGUITY!>test<!>()
}
}
@@ -57,6 +57,6 @@ class ManySupers3: Bar2(), C {
fun foo() {
super<Bar2>.test()
super<C>.test()
super.test()
super.<!AMBIGUITY!>test<!>()
}
}
@@ -3,7 +3,7 @@
abstract class A : MutableList<String> {
override fun sort(/*0*/ p0: java.util.Comparator<in String>) {
super.sort(p0)
super.<!UNRESOLVED_REFERENCE!>sort<!>(p0)
}
}
@@ -22,7 +22,7 @@ FILE fqName:<root> fileName:/enumWithMultipleCtors.kt
RETURN type=kotlin.Nothing from='public final fun f (): kotlin.String declared in <root>.A.Y'
CALL 'public final fun plus (other: kotlin.Any?): kotlin.String [operator] declared in kotlin.String' type=kotlin.String origin=null
$this: CALL 'public open fun f (): kotlin.String declared in <root>.A' type=kotlin.String origin=null
$this: ERROR_CALL 'Unresolved reference: super<R|A|>' type=<root>.A
$this: GET_VAR '<this>: <uninitialized parent>.<anonymous> declared in <no parent>.<anonymous>' type=<uninitialized parent>.<anonymous> origin=null
other: CONST String type=kotlin.String value="#Y"
ENUM_ENTRY name:Z
class: CLASS ENUM_ENTRY name:Z modality:FINAL visibility:local superTypes:[<root>.A]
@@ -50,7 +50,7 @@ FILE fqName:<root> fileName:/implicitNotNullOnDelegatedImplementation.kt
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun foo (): kotlin.String declared in <root>.K2'
CALL 'public open fun foo (): kotlin.String [operator] declared in <root>.JFoo' type=kotlin.String origin=null
$this: ERROR_CALL 'Unresolved reference: super<R|JFoo|>' type=<root>.JFoo
$this: GET_VAR '<this>: <root>.K2 declared in <root>.K2.foo' type=<root>.K2 origin=null
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
overridden:
public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any
@@ -93,12 +93,12 @@ FILE fqName:<root> fileName:/implicitNotNullOnDelegatedImplementation.kt
BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in <root>.JUnrelatedFoo'
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:K4 modality:FINAL visibility:public superTypes:[<root>.JUnrelatedFoo; <root>.IFoo]'
FUN name:foo visibility:public modality:FINAL <> ($this:<root>.K4) returnType:kotlin.String?
FUN name:foo visibility:public modality:FINAL <> ($this:<root>.K4) returnType:kotlin.String
$this: VALUE_PARAMETER name:<this> type:<root>.K4
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun foo (): kotlin.String? declared in <root>.K4'
CALL 'public open fun foo (): kotlin.String? [operator] declared in <root>.JUnrelatedFoo' type=kotlin.String? origin=null
$this: ERROR_CALL 'Unresolved reference: super<R|JUnrelatedFoo|>' type=<root>.JUnrelatedFoo
RETURN type=kotlin.Nothing from='public final fun foo (): kotlin.String declared in <root>.K4'
CALL 'public abstract fun foo (): kotlin.String declared in <root>.IFoo' type=kotlin.String origin=null
$this: GET_VAR '<this>: <root>.K4 declared in <root>.K4.foo' type=<root>.K4 origin=null
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
overridden:
public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any
+3 -3
View File
@@ -24,7 +24,7 @@ FILE fqName:<root> fileName:/superCalls.kt
BLOCK_BODY
RETURN type=kotlin.Nothing from='public open fun hashCode (): kotlin.Int declared in <root>.Base'
CALL 'public open fun hashCode (): kotlin.Int declared in kotlin.Any' type=kotlin.Int origin=null
$this: ERROR_CALL 'Unresolved reference: super<R|kotlin/Any|>' type=kotlin.Any
$this: GET_VAR '<this>: <root>.Base declared in <root>.Base.hashCode' type=<root>.Base origin=null
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
overridden:
public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any
@@ -44,7 +44,7 @@ FILE fqName:<root> fileName:/superCalls.kt
$this: VALUE_PARAMETER name:<this> type:<root>.Derived
BLOCK_BODY
CALL 'public open fun foo (): kotlin.Unit declared in <root>.Base' type=kotlin.Unit origin=null
$this: ERROR_CALL 'Unresolved reference: super<R|Base|>' type=<root>.Base
$this: GET_VAR '<this>: <root>.Derived declared in <root>.Derived.foo' type=<root>.Derived origin=null
PROPERTY name:bar visibility:public modality:FINAL [val]
FUN name:<get-bar> visibility:public modality:FINAL <> ($this:<root>.Derived) returnType:kotlin.String
correspondingProperty: PROPERTY name:bar visibility:public modality:FINAL [val]
@@ -52,7 +52,7 @@ FILE fqName:<root> fileName:/superCalls.kt
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-bar> (): kotlin.String declared in <root>.Derived'
CALL 'public open fun <get-bar> (): kotlin.String declared in <root>.Base' type=kotlin.String origin=null
$this: ERROR_CALL 'Unresolved reference: super<R|Base|>' type=<root>.Base
$this: GET_VAR '<this>: <root>.Derived declared in <root>.Derived.<get-bar>' type=<root>.Derived origin=null
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:<root>.Base) returnType:kotlin.Int [fake_override]
overridden:
public open fun hashCode (): kotlin.Int declared in <root>.Base