Add tests for JVM backend diagnostics with K2 light tree

In the vast majority of tests, diagnostics are reported at a slightly
different location in LT vs PSI. This is because in the light tree mode,
backend errors are reported basically on the start of the IR element,
which is for example the keyword "class" for a class and not its name as
in K1 or in K2+PSI. Similarly, the end of the diagnostic is at the
ending offset of the IR element.

Normally it would be a bit user-unfriendly to highlight the whole class
as red, starting from the keyword "class" and ending with the closing
brace "}". But remember that these are backend diagnostics in the K2+LT
mode, which is only possible in the compiler scenario, not in the IDE.
And in this case, the ending offset doesn't matter at all because it's
not presented to the user, and minor change in the starting offset is
not a problem as well.

There are some tests which legitimately fail in the LT mode because the
corresponding diagnostics haven't been supported. They will be dealt
with in subsequent commits:

  testPropertyInlineCycle
  testInlineCycle
  MultifileClasses.testJvmSynthetic
  testSuspendInlineCycle
  testIndirectInlineCycle

 #KT-59586
This commit is contained in:
Alexander Udalov
2023-06-22 17:19:36 +02:00
parent 69c698134b
commit 5f2ff06296
140 changed files with 1511 additions and 137 deletions
@@ -0,0 +1,20 @@
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
public open class A<T> {
fun foo(x: T) = "O"
fun foo(x: A<T>) = "K"
}
interface C<E> {
fun foo(x: E): String
fun foo(x: A<E>): String
}
interface D {
fun foo(x: A<String>): String
}
<!CONFLICTING_INHERITED_JVM_DECLARATIONS{LT}!>class <!CONFLICTING_INHERITED_JVM_DECLARATIONS{PSI}!>B1<!> : A<A<String>>(), D<!>
<!CONFLICTING_INHERITED_JVM_DECLARATIONS{LT}!>interface <!CONFLICTING_INHERITED_JVM_DECLARATIONS{PSI}!>B2<!> : C<A<String>>, D<!>
@@ -1,4 +1,4 @@
// FIR_IDENTICAL
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
public open class A<T> {
@@ -0,0 +1,5 @@
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>fun foo(s: List<String>)<!> {}<!>
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>fun foo(s: MutableList<String>)<!> {}<!>
@@ -1,5 +1,5 @@
// FIR_IDENTICAL
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(s: List<String>)<!> {}
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(s: MutableList<String>)<!> {}
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(s: MutableList<String>)<!> {}
@@ -0,0 +1,15 @@
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface Foo<T> {
fun foo(l: List<T>)
}
interface Bar<T> {
fun foo(l: List<T>)
}
<!CONFLICTING_JVM_DECLARATIONS{LT}!>class <!CONFLICTING_JVM_DECLARATIONS{PSI}!>Baz(f: Foo<String>, b: Bar<Int>)<!> :
Foo<String> by f,
Bar<Int> by b {
}<!>
@@ -1,4 +1,4 @@
// FIR_IDENTICAL
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface Foo<T> {
@@ -0,0 +1,10 @@
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface Foo<T> {
fun foo(l: List<T>)
}
<!CONFLICTING_JVM_DECLARATIONS{LT}!>class <!CONFLICTING_JVM_DECLARATIONS{PSI}!>Bar(f: Foo<String>)<!>: Foo<String> by f {
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>fun foo(l: List<Int>)<!> {}<!>
}<!>
@@ -1,4 +1,4 @@
// FIR_IDENTICAL
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface Foo<T> {
@@ -0,0 +1,16 @@
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface Foo<T> {
fun foo(l: List<T>) {
}
}
<!CONFLICTING_JVM_DECLARATIONS{LT}!>class <!CONFLICTING_JVM_DECLARATIONS{PSI}!>Bar(f: Foo<String>)<!>: Foo<String> by f {
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>fun foo(l: List<Int>)<!> {}<!>
}<!>
class BarOther(f: Foo<String>): Foo<String> by f {
override fun foo(l: List<String>) {}
}
@@ -1,4 +1,4 @@
// FIR_IDENTICAL
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface Foo<T> {
@@ -1,7 +1,9 @@
// COMPARE_WITH_LIGHT_TREE
class G<T>
<!CONFLICTING_JVM_DECLARATIONS!>val <T> G<T>.foo: Int<!>
get() = 1
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>val <T> G<T>.foo: Int<!>
get() = 1<!>
<!CONFLICTING_JVM_DECLARATIONS!>val G<String>.foo: Int<!>
get() = 1
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>val G<String>.foo: Int<!>
get() = 1<!>
@@ -1,7 +1,9 @@
// COMPARE_WITH_LIGHT_TREE
class G<T>
val <T> G<T>.foo: Int
<!CONFLICTING_JVM_DECLARATIONS!>get()<!> = 1
val G<String>.foo: Int
<!CONFLICTING_JVM_DECLARATIONS!>get()<!> = 1
<!CONFLICTING_JVM_DECLARATIONS!>get()<!> = 1
@@ -0,0 +1,7 @@
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
class G<T>
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>fun foo(x: G<String>): G<Int><!> {null!!}<!>
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>fun foo(x: G<Int>): G<String><!> {null!!}<!>
@@ -1,7 +1,7 @@
// FIR_IDENTICAL
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
class G<T>
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(x: G<String>): G<Int><!> {null!!}
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(x: G<Int>): G<String><!> {null!!}
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(x: G<Int>): G<String><!> {null!!}
@@ -0,0 +1,13 @@
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface Foo<T> {
fun foo(l: List<T>) {}
}
interface Bar<T> {
fun foo(l: List<T>) {}
}
<!CONFLICTING_INHERITED_JVM_DECLARATIONS{LT}!>class <!CONFLICTING_INHERITED_JVM_DECLARATIONS{PSI}!>Baz()<!>: Foo<String>, Bar<Int> {
}<!>
@@ -1,4 +1,4 @@
// FIR_IDENTICAL
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface Foo<T> {
@@ -10,4 +10,4 @@ interface Bar<T> {
}
class <!CONFLICTING_INHERITED_JVM_DECLARATIONS!>Baz()<!>: Foo<String>, Bar<Int> {
}
}
@@ -0,0 +1,5 @@
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER -PLATFORM_CLASS_MAPPED_TO_KOTLIN
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>fun foo(s: List<String>)<!> {}<!>
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>fun foo(s: java.util.List<String>)<!> {}<!>
@@ -1,5 +1,5 @@
// FIR_IDENTICAL
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER -PLATFORM_CLASS_MAPPED_TO_KOTLIN
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(s: List<String>)<!> {}
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(s: java.util.List<String>)<!> {}
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(s: java.util.List<String>)<!> {}
@@ -0,0 +1,5 @@
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>fun foo(x: String)<!> {}<!>
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>fun foo(x: String?)<!> {}<!>
@@ -1,5 +1,5 @@
// FIR_IDENTICAL
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(x: String)<!> {}
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(x: String?)<!> {}
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(x: String?)<!> {}
@@ -0,0 +1,14 @@
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface A<T> {
fun foo(l: List<T>)
}
interface B {
fun foo(l: List<Int>) {}
}
<!ACCIDENTAL_OVERRIDE{LT}!>class <!ACCIDENTAL_OVERRIDE{PSI}!>C(f: A<String>)<!>: A<String> by f, B<!>
<!DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE!>class D<!>(f: A<Int>): A<Int> by f, B
@@ -1,4 +1,4 @@
// FIR_IDENTICAL
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface A<T> {
@@ -0,0 +1,14 @@
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface Foo<T> {
fun foo(l: List<T>) {}
}
interface Bar<T> {
fun foo(l: List<T>) {}
}
class Baz(): Foo<String>, Bar<Int> {
<!ACCIDENTAL_OVERRIDE{LT}!><!ACCIDENTAL_OVERRIDE{PSI}!>fun foo(l: List<Long>)<!> {}<!>
}
@@ -1,4 +1,4 @@
// FIR_IDENTICAL
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface Foo<T> {
@@ -11,4 +11,4 @@ interface Bar<T> {
class Baz(): Foo<String>, Bar<Int> {
<!ACCIDENTAL_OVERRIDE!>fun foo(l: List<Long>)<!> {}
}
}
@@ -0,0 +1,5 @@
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER -PLATFORM_CLASS_MAPPED_TO_KOTLIN
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>fun foo(s: java.lang.String)<!> {}<!>
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>fun foo(s: String)<!> {}<!>
@@ -1,5 +1,5 @@
// FIR_IDENTICAL
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER -PLATFORM_CLASS_MAPPED_TO_KOTLIN
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(s: java.lang.String)<!> {}
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(s: String)<!> {}
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(s: String)<!> {}
@@ -0,0 +1,5 @@
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>fun <T> foo(x: T): T<!> {null!!}<!>
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>fun foo(x: Any): Any<!> {null!!}<!>
@@ -1,5 +1,5 @@
// FIR_IDENTICAL
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
<!CONFLICTING_JVM_DECLARATIONS!>fun <T> foo(x: T): T<!> {null!!}
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(x: Any): Any<!> {null!!}
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(x: Any): Any<!> {null!!}
@@ -0,0 +1,7 @@
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface Foo
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>fun <T: Foo> foo(x: T): T<!> {null!!}<!>
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>fun foo(x: Foo): Foo<!> {null!!}<!>
@@ -1,7 +1,7 @@
// FIR_IDENTICAL
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface Foo
<!CONFLICTING_JVM_DECLARATIONS!>fun <T: Foo> foo(x: T): T<!> {null!!}
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(x: Foo): Foo<!> {null!!}
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(x: Foo): Foo<!> {null!!}
@@ -0,0 +1,9 @@
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface Foo
interface Bar
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>fun <T> foo(x: T): T<!> where T: Foo, T: Bar {null!!}<!>
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>fun foo(x: Foo): Foo<!> {null!!}<!>
fun foo(x: Bar): Bar {null!!}
@@ -1,4 +1,4 @@
// FIR_IDENTICAL
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface Foo
@@ -6,4 +6,4 @@ interface Bar
<!CONFLICTING_JVM_DECLARATIONS!>fun <T> foo(x: T): T<!> where T: Foo, T: Bar {null!!}
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(x: Foo): Foo<!> {null!!}
fun foo(x: Bar): Bar {null!!}
fun foo(x: Bar): Bar {null!!}
@@ -0,0 +1,9 @@
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface Foo
interface Bar
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>fun <T> foo(x: T): T<!> where T: Foo, T: Bar {null!!}<!>
<!CONFLICTING_JVM_DECLARATIONS{LT}!><!CONFLICTING_JVM_DECLARATIONS{PSI}!>fun foo(x: Foo): Foo<!> {null!!}<!>
fun foo(x: Bar): Bar {null!!}
@@ -1,4 +1,4 @@
// FIR_IDENTICAL
// COMPARE_WITH_LIGHT_TREE
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface Foo
@@ -6,4 +6,4 @@ interface Bar
<!CONFLICTING_JVM_DECLARATIONS!>fun <T> foo(x: T): T<!> where T: Foo, T: Bar {null!!}
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(x: Foo): Foo<!> {null!!}
fun foo(x: Bar): Bar {null!!}
fun foo(x: Bar): Bar {null!!}