TypeConstructor's equality for classes relies on FqNames
This is needed because different modules/libraries may define classes with the same FqNames, which may be identical or slightly different. Such classes must be considered equal, because your dependencies may rely on different packagings of the same codebase, and the classes there will be distinct though identical (think intellij-core vs idea-full).
This commit is contained in:
+29
@@ -0,0 +1,29 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// MODULE: m1
|
||||
// FILE: a.kt
|
||||
|
||||
package p
|
||||
|
||||
public class A
|
||||
public class M1 {
|
||||
public val a: A = A()
|
||||
}
|
||||
|
||||
// MODULE: m2
|
||||
// FILE: b.kt
|
||||
|
||||
package p
|
||||
|
||||
public class A<T>
|
||||
|
||||
public fun foo(a: A<Int>) {
|
||||
}
|
||||
|
||||
// MODULE: m3(m1, m2)
|
||||
// FILE: b.kt
|
||||
|
||||
import p.*
|
||||
|
||||
fun test() {
|
||||
foo(<!TYPE_MISMATCH!>M1().a<!>)
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// MODULE: m1
|
||||
// FILE: a.kt
|
||||
|
||||
package p
|
||||
|
||||
public class A<T>
|
||||
public class M1 {
|
||||
public val a: A<Int> = A<Int>()
|
||||
}
|
||||
|
||||
// MODULE: m2
|
||||
// FILE: b.kt
|
||||
|
||||
package p
|
||||
|
||||
public class A
|
||||
|
||||
public fun foo(a: A) {
|
||||
}
|
||||
|
||||
// MODULE: m3(m1, m2)
|
||||
// FILE: b.kt
|
||||
|
||||
import p.*
|
||||
|
||||
fun test() {
|
||||
foo(<!TYPE_MISMATCH!>M1().a<!>)
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||
// MODULE: m1
|
||||
// FILE: a.kt
|
||||
|
||||
package p
|
||||
|
||||
public class A
|
||||
public class B {
|
||||
public val a: A = A()
|
||||
}
|
||||
|
||||
// MODULE: m2
|
||||
// FILE: b.kt
|
||||
|
||||
package p
|
||||
|
||||
public class A {
|
||||
val x = 1
|
||||
}
|
||||
|
||||
public fun foo(a: A) {
|
||||
a.x + 1
|
||||
}
|
||||
|
||||
// MODULE: m3(m1, m2)
|
||||
// FILE: b.kt
|
||||
|
||||
import p.*
|
||||
|
||||
fun test() {
|
||||
foo(B().a)
|
||||
}
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// MODULE: m1
|
||||
// FILE: a.kt
|
||||
|
||||
package p
|
||||
|
||||
public class A {
|
||||
public class B
|
||||
public object C
|
||||
class object {
|
||||
public class D {
|
||||
public object E
|
||||
}
|
||||
public class G
|
||||
}
|
||||
|
||||
public inner class F
|
||||
}
|
||||
|
||||
public class M1 {
|
||||
public val a: A = A()
|
||||
public val b: A.B = A.B()
|
||||
public val c: A.C = A.C
|
||||
public val d: A.D = A.D()
|
||||
public val e: A.D.E = A.D.E
|
||||
public val f: A.F = A().F()
|
||||
public val g: A.G = A.G()
|
||||
}
|
||||
|
||||
// MODULE: m2
|
||||
// FILE: b.kt
|
||||
|
||||
package p
|
||||
|
||||
public class A {
|
||||
public class B
|
||||
public class C
|
||||
class object {
|
||||
public class D {
|
||||
public class E
|
||||
}
|
||||
}
|
||||
public class G
|
||||
public inner class F
|
||||
}
|
||||
|
||||
public fun a(p: A) {}
|
||||
public fun b(p: A.B) {}
|
||||
public fun c(p: A.C) {}
|
||||
public fun d(p: A.D) {}
|
||||
public fun e(p: A.D.E) {}
|
||||
public fun f(p: A.F) {}
|
||||
public fun g(p: A.G) {}
|
||||
|
||||
// MODULE: m3(m1, m2)
|
||||
// FILE: b.kt
|
||||
|
||||
import p.*
|
||||
|
||||
fun test(m1: M1) {
|
||||
a(m1.a)
|
||||
b(m1.b)
|
||||
c(m1.c)
|
||||
d(m1.d)
|
||||
e(m1.e)
|
||||
f(m1.f)
|
||||
g(m1.g)
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// MODULE: m1
|
||||
// FILE: a.kt
|
||||
|
||||
package p
|
||||
|
||||
public trait A
|
||||
public class B : A
|
||||
public class M1 {
|
||||
public val b: B = B()
|
||||
}
|
||||
|
||||
// MODULE: m2
|
||||
// FILE: b.kt
|
||||
|
||||
package p
|
||||
|
||||
public trait A
|
||||
|
||||
public fun foo(a: A) {
|
||||
}
|
||||
|
||||
// MODULE: m3(m1, m2)
|
||||
// FILE: b.kt
|
||||
|
||||
import p.*
|
||||
|
||||
fun test() {
|
||||
foo(M1().b)
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// MODULE: m1
|
||||
// FILE: a.kt
|
||||
|
||||
package p
|
||||
|
||||
public class A<X, Y>
|
||||
public class M1 {
|
||||
public val a: A<!WRONG_NUMBER_OF_TYPE_ARGUMENTS!><Int><!> = A<Int, Int>()
|
||||
}
|
||||
|
||||
// MODULE: m2
|
||||
// FILE: b.kt
|
||||
|
||||
package p
|
||||
|
||||
public class A<X, Y>
|
||||
|
||||
public fun foo(a: A<!WRONG_NUMBER_OF_TYPE_ARGUMENTS!><Int><!>) {
|
||||
}
|
||||
|
||||
// MODULE: m3(m1, m2)
|
||||
// FILE: b.kt
|
||||
|
||||
import p.*
|
||||
|
||||
fun test() {
|
||||
foo(M1().<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>a<!>)
|
||||
foo(1) // error type on the declaration site
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// MODULE: m1
|
||||
// FILE: a.kt
|
||||
|
||||
package p
|
||||
|
||||
public trait A<T>
|
||||
public trait C
|
||||
public trait D<T>
|
||||
public class B : A<Int>, C, D<Int>
|
||||
public class M1 {
|
||||
public val b: B = B()
|
||||
}
|
||||
|
||||
// MODULE: m2
|
||||
// FILE: b.kt
|
||||
|
||||
package p
|
||||
|
||||
public trait A
|
||||
public trait C<T>
|
||||
public trait D<T>
|
||||
|
||||
public fun a(a: A) {
|
||||
}
|
||||
|
||||
public fun c(c: C<Int>) {
|
||||
}
|
||||
|
||||
public fun d(d: D<Int>) {
|
||||
}
|
||||
|
||||
// MODULE: m3(m1, m2)
|
||||
// FILE: b.kt
|
||||
|
||||
import p.*
|
||||
|
||||
fun test() {
|
||||
a(<!TYPE_MISMATCH!>M1().b<!>) // Type arguments do not match
|
||||
c(<!TYPE_MISMATCH!>M1().b<!>) // Type arguments do not match
|
||||
d(M1().b) // Type arguments do match
|
||||
}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
// MODULE: m1
|
||||
// FILE: a.kt
|
||||
|
||||
package p
|
||||
|
||||
public class A
|
||||
public class B {
|
||||
public val a: A = A()
|
||||
}
|
||||
|
||||
// MODULE: m2(m1)
|
||||
// FILE: b.kt
|
||||
|
||||
package p
|
||||
|
||||
class A {
|
||||
fun foo() {}
|
||||
}
|
||||
|
||||
fun test() {
|
||||
val a: A = B().a
|
||||
a.foo()
|
||||
}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
// MODULE: m1
|
||||
// FILE: a.kt
|
||||
|
||||
package p
|
||||
|
||||
public class A
|
||||
public class B {
|
||||
public val a: A = A()
|
||||
}
|
||||
|
||||
// MODULE: m2(m1)
|
||||
// FILE: b.kt
|
||||
|
||||
package p
|
||||
|
||||
class A {
|
||||
fun foo() {}
|
||||
}
|
||||
|
||||
fun test() {
|
||||
val a = B().a
|
||||
a.<!UNRESOLVED_REFERENCE!>foo<!>()
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||
// MODULE: m1
|
||||
// FILE: a.kt
|
||||
|
||||
package p
|
||||
|
||||
public class A {
|
||||
public fun m1() {}
|
||||
}
|
||||
public class M1 {
|
||||
public val a: A = A()
|
||||
}
|
||||
|
||||
// MODULE: m2
|
||||
// FILE: b.kt
|
||||
|
||||
package p
|
||||
|
||||
public class A {
|
||||
public fun m2() {}
|
||||
}
|
||||
|
||||
public class M2 {
|
||||
public val a: A = A()
|
||||
}
|
||||
|
||||
// MODULE: m3(m1, m2)
|
||||
// FILE: b.kt
|
||||
|
||||
import p.*
|
||||
|
||||
fun test(a: A) {
|
||||
a.m1()
|
||||
|
||||
M1().a.m1()
|
||||
|
||||
M2().a.m2()
|
||||
}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||
// MODULE: m1
|
||||
// FILE: a.kt
|
||||
|
||||
package p
|
||||
|
||||
public class A
|
||||
public class B {
|
||||
public val a: A = A()
|
||||
}
|
||||
|
||||
// MODULE: m2(m1)
|
||||
// FILE: b.kt
|
||||
|
||||
import p.*
|
||||
|
||||
class A
|
||||
|
||||
fun test() {
|
||||
val a: A = <!TYPE_MISMATCH!>B().a<!>
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// MODULE: m1
|
||||
// FILE: a.kt
|
||||
|
||||
package p
|
||||
|
||||
public class A<T>
|
||||
public class M1 {
|
||||
public val a: A<Int> = A()
|
||||
}
|
||||
|
||||
// MODULE: m2
|
||||
// FILE: b.kt
|
||||
|
||||
package p
|
||||
|
||||
public class A<T>
|
||||
|
||||
public fun foo(a: A<Int>) {
|
||||
}
|
||||
|
||||
// MODULE: m3(m1, m2)
|
||||
// FILE: b.kt
|
||||
|
||||
import p.*
|
||||
|
||||
fun test() {
|
||||
foo(M1().a)
|
||||
}
|
||||
Reference in New Issue
Block a user