[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:
committed by
teamcityserver
parent
d1531f9cdd
commit
c4c2fbb5a0
@@ -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>
|
||||
|
||||
-4
@@ -1,4 +0,0 @@
|
||||
open class C : D() {
|
||||
open class CC
|
||||
}
|
||||
open class D : C.CC()
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
open class C : <!CYCLIC_INHERITANCE_HIERARCHY!>D<!>() {
|
||||
open class CC
|
||||
}
|
||||
|
||||
-3
@@ -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
|
||||
}
|
||||
|
||||
Vendored
-8
@@ -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")
|
||||
}
|
||||
Vendored
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
open class A : <!CYCLIC_INHERITANCE_HIERARCHY!>B<!>()
|
||||
open class B : <!CYCLIC_INHERITANCE_HIERARCHY!>A<!>()
|
||||
|
||||
|
||||
-8
@@ -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
@@ -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() {}
|
||||
}
|
||||
|
||||
-17
@@ -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 {
|
||||
|
||||
+1
-1
@@ -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() {}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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<!>() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
-22
@@ -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
|
||||
|
||||
-6
@@ -1,6 +0,0 @@
|
||||
open class A : B.BB() {
|
||||
open class AA
|
||||
}
|
||||
open class B : A.AA() {
|
||||
open class BB
|
||||
}
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
open class A : <!CYCLIC_INHERITANCE_HIERARCHY!>B.BB<!>() {
|
||||
open class AA
|
||||
}
|
||||
|
||||
Vendored
+2
-2
@@ -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()
|
||||
|
||||
+2
-2
@@ -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
|
||||
|
||||
|
||||
+3
-3
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user