[FIR] Implement RECURSIVE_TYPEALIAS_EXPANSION, CYCLIC_INHERITANCE_HIERARCHY diagnostics, fix stackoverlow exception in case if typealias points to type with type arguments

This commit is contained in:
Ivan Kochurkin
2021-05-26 12:34:19 +03:00
committed by teamcityserver
parent d1531f9cdd
commit c4c2fbb5a0
48 changed files with 213 additions and 249 deletions
@@ -1,4 +0,0 @@
open class C : D() {
open class CC
}
open class D : C.CC()
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
open class C : <!CYCLIC_INHERITANCE_HIERARCHY!>D<!>() {
open class CC
}
@@ -1,3 +0,0 @@
open class E : E.EE() {
open class EE
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
open class E : <!CYCLIC_INHERITANCE_HIERARCHY!>E.EE<!>() {
open class EE
}
@@ -1,8 +0,0 @@
open class A : B()
open class B : <!OTHER_ERROR!>A<!>()
fun <T> select(vararg xs: T): T = xs[0]
fun foo() {
val x = select(A(), B(), "foo")
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
open class A : <!CYCLIC_INHERITANCE_HIERARCHY!>B<!>()
open class B : <!CYCLIC_INHERITANCE_HIERARCHY!>A<!>()
@@ -1,8 +0,0 @@
open class A : B()
open class B : <!OTHER_ERROR!>A<!>()
fun <T> select(vararg xs: T): T = xs[0]
fun foo() {
select(A(), B())
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
open class A : <!CYCLIC_INHERITANCE_HIERARCHY!>B<!>()
open class B : <!CYCLIC_INHERITANCE_HIERARCHY!>A<!>()
@@ -1,30 +0,0 @@
interface A {
fun foo() {}
}
interface B : A, E {}
interface C : <!OTHER_ERROR!>B<!> {}
interface D : <!OTHER_ERROR!>B<!> {}
interface E : F {}
interface F : D, C {}
interface G : F {}
interface H : F {}
val a : A? = null
val b : B? = null
val c : C? = null
val d : D? = null
val e : E? = null
val f : F? = null
val g : G? = null
val h : H? = null
fun test() {
a?.foo()
b?.foo()
c?.<!UNRESOLVED_REFERENCE!>foo<!>()
d?.<!UNRESOLVED_REFERENCE!>foo<!>()
e?.<!UNRESOLVED_REFERENCE!>foo<!>()
f?.<!UNRESOLVED_REFERENCE!>foo<!>()
g?.<!UNRESOLVED_REFERENCE!>foo<!>()
h?.<!UNRESOLVED_REFERENCE!>foo<!>()
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
interface A {
fun foo() {}
}
@@ -1,17 +0,0 @@
// FILE: A.java
interface A extends C {
void foo();
}
// FILE: B.kt
interface B : <!EXPOSED_SUPER_INTERFACE!>A<!> {
fun bar()
}
// FILE: C.java
interface C extends B {
void baz();
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// FILE: A.java
interface A extends C {
@@ -1,11 +0,0 @@
// FILE: J.java
class J extends K {
void foo() {}
}
// FILE: K.kt
class K : <!EXPOSED_SUPER_CLASS!>J<!>() {
fun bar() {}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// FILE: J.java
class J extends K {
@@ -12,6 +12,6 @@ class J extends I {
// FILE: K.kt
open class K : <!EXPOSED_SUPER_CLASS!>J<!>() {
open class K : <!CYCLIC_INHERITANCE_HIERARCHY!>J<!>() {
fun baz() {}
}
@@ -5,7 +5,7 @@ interface ExceptionTracker : <!EXPOSED_SUPER_INTERFACE!>LockBasedStorageManager.
// FILE: StorageManager.kt
interface StorageManager : ExceptionTracker {
interface StorageManager : <!CYCLIC_INHERITANCE_HIERARCHY!>ExceptionTracker<!> {
fun foo()
}
@@ -1,10 +1,10 @@
// KT-303 Stack overflow on a cyclic class hierarchy
open class Foo() : Bar() {
open class Foo() : <!CYCLIC_INHERITANCE_HIERARCHY!>Bar<!>() {
val a : Int = 1
}
open class Bar() : <!OTHER_ERROR!>Foo<!>() {
open class Bar() : <!CYCLIC_INHERITANCE_HIERARCHY!>Foo<!>() {
}
@@ -1,22 +0,0 @@
// As in KT-18514
object A : A.I {
interface I
}
// Similar to 'classIndirectlyInheritsNested.kt'
object D : E() {
open class NestedD
}
open class E : D.NestedD()
// Similar to 'twoClassesWithNestedCycle.kt'
object G : H.NestedH() {
open class NestedG
}
object H : G.NestedG() {
open class NestedH
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// As in KT-18514
object A : <!CYCLIC_INHERITANCE_HIERARCHY!>A.I<!> {
interface I
@@ -1,6 +0,0 @@
open class A : B.BB() {
open class AA
}
open class B : A.AA() {
open class BB
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
open class A : <!CYCLIC_INHERITANCE_HIERARCHY!>B.BB<!>() {
open class AA
}