[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,6 +1,6 @@
open class RecA<T>: RecB<T>()
open class RecB<T>: <!OTHER_ERROR!>RecA<T><!>()
open class SelfR<T>: <!OTHER_ERROR!>SelfR<T><!>()
open class RecA<T>: <!CYCLIC_INHERITANCE_HIERARCHY!>RecB<T><!>()
open class RecB<T>: <!CYCLIC_INHERITANCE_HIERARCHY!>RecA<T><!>()
open class SelfR<T>: <!CYCLIC_INHERITANCE_HIERARCHY!>SelfR<T><!>()
fun test(f: SelfR<String>) = f is RecA<String>
fun test(f: RecB<String>) = f is RecA<String>
fun test(f: RecB<String>) = f is RecA<String>
@@ -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
}
@@ -8,8 +8,8 @@ class Foo
class Bar
typealias YBar = <!OTHER_ERROR!>ZBar<!>
typealias ZBar = YBar
typealias YBar = <!RECURSIVE_TYPEALIAS_EXPANSION!>ZBar<!>
typealias ZBar = <!RECURSIVE_TYPEALIAS_EXPANSION!>YBar<!>
fun Foo.foo(body: Foo.() -> Unit) = body()
fun Foo.zbar(body: ZBar.() -> Unit) = Bar().body()
@@ -7,7 +7,7 @@ val bImpl: B.Companion.Interface
get() = null!!
interface A {
companion object : <!FINAL_SUPERTYPE!>Nested<!>(), Interface by aImpl, I<Nested, Interface> {
companion object : <!CYCLIC_INHERITANCE_HIERARCHY!>Nested<!>(), <!CYCLIC_INHERITANCE_HIERARCHY!>Interface<!> by aImpl, <!CYCLIC_INHERITANCE_HIERARCHY!>I<Nested, Interface><!> {
class Nested
@@ -16,7 +16,7 @@ interface A {
}
class B {
companion object : <!FINAL_SUPERTYPE!>Nested<!>(), Interface by aImpl, I<Nested, Interface> {
companion object : <!CYCLIC_INHERITANCE_HIERARCHY!>Nested<!>(), <!CYCLIC_INHERITANCE_HIERARCHY!>Interface<!> by aImpl, <!CYCLIC_INHERITANCE_HIERARCHY!>I<Nested, Interface><!> {
class Nested
@@ -1,7 +1,7 @@
class A : B() {
class A : <!CYCLIC_INHERITANCE_HIERARCHY!>B<!>() {
open class Nested<T>
}
typealias ANested<T> = A.Nested<T>
typealias ANested<T> = <!RECURSIVE_TYPEALIAS_EXPANSION!>A.Nested<T><!>
open class B : ANested<Int>()
open class B : <!CYCLIC_INHERITANCE_HIERARCHY, UNRESOLVED_REFERENCE!>ANested<Int><!>()
@@ -1,11 +1,12 @@
typealias R = <!OTHER_ERROR!>R<!>
typealias R = <!RECURSIVE_TYPEALIAS_EXPANSION!>R<!>
typealias L = List<L>
typealias L = <!RECURSIVE_TYPEALIAS_EXPANSION!>List<L><!>
typealias A = <!OTHER_ERROR!>B<!>
typealias B = A
typealias A = <!RECURSIVE_TYPEALIAS_EXPANSION!>B<!>
typealias B = <!RECURSIVE_TYPEALIAS_EXPANSION!>A<!>
typealias F1 = (Int) -> F2
typealias F2 = (F1) -> Int
typealias F1 = <!RECURSIVE_TYPEALIAS_EXPANSION!>(Int) -> F2<!>
typealias F2 = <!RECURSIVE_TYPEALIAS_EXPANSION!>(F1) -> Int<!>
typealias F3 = (F1) -> Int
val x: A = TODO()
val x: F3 = TODO()
+2 -1
View File
@@ -7,5 +7,6 @@ typealias B = <!RECURSIVE_TYPEALIAS_EXPANSION!>A<!>
typealias F1 = <!RECURSIVE_TYPEALIAS_EXPANSION!>(Int) -> F2<!>
typealias F2 = <!RECURSIVE_TYPEALIAS_EXPANSION!>(F1) -> Int<!>
typealias F3 = <!RECURSIVE_TYPEALIAS_EXPANSION!>(F1) -> Int<!>
val x: <!RECURSIVE_TYPEALIAS_EXPANSION!>A<!> = TODO()
val x: <!RECURSIVE_TYPEALIAS_EXPANSION!>F3<!> = TODO()
@@ -1,9 +1,11 @@
package
public val x: [ERROR : Recursive type alias: A]
public val x: F3 /* = (F1 /* = (kotlin.Int) -> F2 /* = ([ERROR : Recursive type alias: F1]) -> kotlin.Int */ */) -> kotlin.Int */
public typealias A = B
public typealias B = A
public typealias F1 = (kotlin.Int) -> F2
public typealias F2 = (F1) -> kotlin.Int
public typealias F3 = (F1) -> kotlin.Int
public typealias L = kotlin.collections.List<L>
public typealias R = R