Build recursive raw types and raw types which contain type parameters properly

1) Substitute erasure of other type parameters
2) Use star projection at top level for recursive raw types

^KT-46126 Fixed
This commit is contained in:
Victor Petukhov
2021-04-19 23:12:10 +03:00
parent f9d2ca68ce
commit 8dd71ec5c8
35 changed files with 606 additions and 41 deletions
@@ -12,5 +12,5 @@ fun <R> choose3(c: Inv<Inv<R>>) {}
fun f(o: Out<Out<*>>, i: In<In<*>>, inv: Inv<Inv<*>>) {
choose1(o)
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER{NI}, TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER{OI}!>choose2<!>(i)
<!TYPE_INFERENCE_PARAMETER_CONSTRAINT_ERROR{OI}!>choose3<!>(<!TYPE_MISMATCH{NI}!>inv<!>)
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER{OI}, TYPE_INFERENCE_PARAMETER_CONSTRAINT_ERROR{OI}!>choose3<!>(<!TYPE_MISMATCH!>inv<!>)
}
@@ -28,5 +28,5 @@ abstract class MySettingsListener<S extends MyComparableSettings> {}
fun test() {
val a = MySettings.getSettings()
a.getLinkedProjectsSettings()
a.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE{OI}, TYPE_INFERENCE_UPPER_BOUND_VIOLATED{OI}, UNRESOLVED_REFERENCE_WRONG_RECEIVER{NI}!>linkedProjectsSettings<!>
a.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE{OI}, TYPE_INFERENCE_UPPER_BOUND_VIOLATED{OI}!>linkedProjectsSettings<!>
}
@@ -10,5 +10,5 @@ public open class MySettings</*0*/ SS : MySettings<SS!, PS!, L!>!, /*1*/ PS : My
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public open fun getSettings(): MySettings<(raw) MySettings<*, *, *>!, (raw) MyComparableSettings!, (raw) MySettingsListener<*>!>!
public open fun getSettings(): (MySettings<(raw) *, (raw) MyComparableSettings!, (raw) MySettingsListener<MyComparableSettings!>!>..MySettings<*, *, out MySettingsListener<*>!>?)
}
+1 -1
View File
@@ -5,7 +5,7 @@ package a {
public open class C</*0*/ B : a.C<B!>!> {
public constructor C</*0*/ B : a.C<B!>!>()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open fun foo(): a.C<(raw) a.C<*>!>!
public open fun foo(): a.C<(raw) *>!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
@@ -0,0 +1,26 @@
// WITH_RUNTIME
// FULL_JDK
// FILE: X.java
class X<B extends I<P, B>, P> {
static final E<X> E = new E<>();
String getId() {
return null;
}
}
class E<T> {
T getT() {
return null;
}
}
interface I<P, L> {}
// FILE: test.kt
fun test() {
val t = X.E.<!UNRESOLVED_REFERENCE!>t<!>
t
t.<!UNRESOLVED_REFERENCE!>id<!> // should be OK
}
@@ -0,0 +1,26 @@
// WITH_RUNTIME
// FULL_JDK
// FILE: X.java
class X<B extends I<P, B>, P> {
static final E<X> E = new E<>();
String getId() {
return null;
}
}
class E<T> {
T getT() {
return null;
}
}
interface I<P, L> {}
// FILE: test.kt
fun test() {
val t = X.E.t
<!DEBUG_INFO_EXPRESSION_TYPE("(X<*, (kotlin.Any..kotlin.Any?)>..X<*, *>?)")!>t<!>
t.id // should be OK
}
@@ -0,0 +1,14 @@
package
public fun test(): kotlin.Unit
public/*package*/ open class X</*0*/ B : I<P!, B!>!, /*1*/ P : kotlin.Any!> {
public/*package*/ constructor X</*0*/ B : I<P!, B!>!, /*1*/ P : kotlin.Any!>()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open fun getId(): kotlin.String!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public/*package*/ final val E: E<X<(raw) *, (raw) kotlin.Any!>!>!
}
@@ -0,0 +1,26 @@
// WITH_RUNTIME
// FULL_JDK
// FILE: X.java
class X<B extends I<B>> {
static final E<X> E = new E<>();
String getId() {
return null;
}
}
class E<T> {
T getT() {
return null;
}
}
interface I<P> {}
// FILE: test.kt
fun test() {
val t = X.E.<!UNRESOLVED_REFERENCE!>t<!>
t
t.<!UNRESOLVED_REFERENCE!>id<!> // should be OK
}
@@ -0,0 +1,26 @@
// WITH_RUNTIME
// FULL_JDK
// FILE: X.java
class X<B extends I<B>> {
static final E<X> E = new E<>();
String getId() {
return null;
}
}
class E<T> {
T getT() {
return null;
}
}
interface I<P> {}
// FILE: test.kt
fun test() {
val t = X.E.t
<!DEBUG_INFO_EXPRESSION_TYPE("(X<*>..X<*>?)")!>t<!>
t.id // should be OK
}
@@ -0,0 +1,14 @@
package
public fun test(): kotlin.Unit
public/*package*/ open class X</*0*/ B : I<B!>!> {
public/*package*/ constructor X</*0*/ B : I<B!>!>()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open fun getId(): kotlin.String!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public/*package*/ final val E: E<X<(raw) *>!>!
}
@@ -0,0 +1,26 @@
// WITH_RUNTIME
// FULL_JDK
// FILE: X.java
class X<B extends I<P>, P> {
static final E<X> E = new E<>();
String getId() {
return null;
}
}
class E<T> {
T getT() {
return null;
}
}
interface I<P> {}
// FILE: test.kt
fun test() {
val t = X.E.<!UNRESOLVED_REFERENCE!>t<!>
t
t.<!UNRESOLVED_REFERENCE!>id<!> // should be OK
}
@@ -0,0 +1,26 @@
// WITH_RUNTIME
// FULL_JDK
// FILE: X.java
class X<B extends I<P>, P> {
static final E<X> E = new E<>();
String getId() {
return null;
}
}
class E<T> {
T getT() {
return null;
}
}
interface I<P> {}
// FILE: test.kt
fun test() {
val t = X.E.t
<!DEBUG_INFO_EXPRESSION_TYPE("(X<(I<(kotlin.Any..kotlin.Any?)>..I<(kotlin.Any..kotlin.Any?)>?), (kotlin.Any..kotlin.Any?)>..X<out (I<*>..I<*>?), *>?)")!>t<!>
t.id // should be OK
}
@@ -0,0 +1,14 @@
package
public fun test(): kotlin.Unit
public/*package*/ open class X</*0*/ B : I<P!>!, /*1*/ P : kotlin.Any!> {
public/*package*/ constructor X</*0*/ B : I<P!>!, /*1*/ P : kotlin.Any!>()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open fun getId(): kotlin.String!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public/*package*/ final val E: E<(X<(raw) I<kotlin.Any!>!, (raw) kotlin.Any!>..X<out I<*>!, *>?)>!
}
@@ -0,0 +1,27 @@
// WITH_RUNTIME
// FULL_JDK
// FILE: X.java
class X<B extends I1<P, P, P>, P, A extends I1<I2<B>, B, I1<P, I2<B>, P>>> {
static final E<X> E = new E<>();
String getId() {
return null;
}
}
class E<T> {
T getT() {
return null;
}
}
interface I1<P, A, F> {}
interface I2<S> {}
// FILE: test.kt
fun test() {
val t = X.E.<!UNRESOLVED_REFERENCE!>t<!>
t
t.<!UNRESOLVED_REFERENCE!>id<!> // error before
}
@@ -0,0 +1,27 @@
// WITH_RUNTIME
// FULL_JDK
// FILE: X.java
class X<B extends I1<P, P, P>, P, A extends I1<I2<B>, B, I1<P, I2<B>, P>>> {
static final E<X> E = new E<>();
String getId() {
return null;
}
}
class E<T> {
T getT() {
return null;
}
}
interface I1<P, A, F> {}
interface I2<S> {}
// FILE: test.kt
fun test() {
val t = X.E.t
<!DEBUG_INFO_EXPRESSION_TYPE("(X<(I1<(kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?)>..I1<(kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?)>?), (kotlin.Any..kotlin.Any?), (I1<*, (I1<(kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?)>..I1<(kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?)>?), *>..I1<*, (I1<(kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?)>..I1<(kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?)>?), *>?)>..X<out (I1<*, *, *>..I1<*, *, *>?), *, out (I1<*, out (I1<*, *, *>..I1<*, *, *>?), *>..I1<*, out (I1<*, *, *>..I1<*, *, *>?), *>?)>?)")!>t<!>
t.<!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>id<!> // error before
}
@@ -0,0 +1,14 @@
package
public fun test(): kotlin.Unit
public/*package*/ open class X</*0*/ B : I1<P!, P!, P!>!, /*1*/ P : kotlin.Any!, /*2*/ A : I1<I2<B!>!, B!, I1<P!, I2<B!>!, P!>!>!> {
public/*package*/ constructor X</*0*/ B : I1<P!, P!, P!>!, /*1*/ P : kotlin.Any!, /*2*/ A : I1<I2<B!>!, B!, I1<P!, I2<B!>!, P!>!>!>()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open fun getId(): kotlin.String!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public/*package*/ final val E: E<(X<(raw) I1<kotlin.Any!, kotlin.Any!, kotlin.Any!>!, (raw) kotlin.Any!, (raw) I1<*, I1<kotlin.Any!, kotlin.Any!, kotlin.Any!>!, *>!>..X<out I1<*, *, *>!, *, out I1<*, out I1<*, *, *>!, *>!>?)>!
}
@@ -0,0 +1,26 @@
// WITH_RUNTIME
// FULL_JDK
// FILE: X.java
class X<B extends I<P>, P, A extends I<B>> {
static final E<X> E = new E<>();
String getId() {
return null;
}
}
class E<T> {
T getT() {
return null;
}
}
interface I<P> {}
// FILE: test.kt
fun test() {
val t = X.E.<!UNRESOLVED_REFERENCE!>t<!>
t
t.<!UNRESOLVED_REFERENCE!>id<!> // should be OK
}
@@ -0,0 +1,26 @@
// WITH_RUNTIME
// FULL_JDK
// FILE: X.java
class X<B extends I<P>, P, A extends I<B>> {
static final E<X> E = new E<>();
String getId() {
return null;
}
}
class E<T> {
T getT() {
return null;
}
}
interface I<P> {}
// FILE: test.kt
fun test() {
val t = X.E.t
<!DEBUG_INFO_EXPRESSION_TYPE("(X<(I<(kotlin.Any..kotlin.Any?)>..I<(kotlin.Any..kotlin.Any?)>?), (kotlin.Any..kotlin.Any?), (I<(I<(kotlin.Any..kotlin.Any?)>..I<(kotlin.Any..kotlin.Any?)>?)>..I<(I<(kotlin.Any..kotlin.Any?)>..I<(kotlin.Any..kotlin.Any?)>?)>?)>..X<out (I<*>..I<*>?), *, out (I<out (I<*>..I<*>?)>..I<out (I<*>..I<*>?)>?)>?)")!>t<!>
t.id // should be OK
}
@@ -0,0 +1,14 @@
package
public fun test(): kotlin.Unit
public/*package*/ open class X</*0*/ B : I<P!>!, /*1*/ P : kotlin.Any!, /*2*/ A : I<B!>!> {
public/*package*/ constructor X</*0*/ B : I<P!>!, /*1*/ P : kotlin.Any!, /*2*/ A : I<B!>!>()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open fun getId(): kotlin.String!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public/*package*/ final val E: E<(X<(raw) I<kotlin.Any!>!, (raw) kotlin.Any!, (raw) I<I<kotlin.Any!>!>!>..X<out I<*>!, *, out I<out I<*>!>!>?)>!
}
@@ -0,0 +1,26 @@
// WITH_RUNTIME
// FULL_JDK
// FILE: X.java
class X<B extends I<P>, P, A extends I<P>> {
static final E<X> E = new E<>();
String getId() {
return null;
}
}
class E<T> {
T getT() {
return null;
}
}
interface I<P> {}
// FILE: test.kt
fun test() {
val t = X.E.<!UNRESOLVED_REFERENCE!>t<!>
t
t.<!UNRESOLVED_REFERENCE!>id<!> // should be OK
}
@@ -0,0 +1,26 @@
// WITH_RUNTIME
// FULL_JDK
// FILE: X.java
class X<B extends I<P>, P, A extends I<P>> {
static final E<X> E = new E<>();
String getId() {
return null;
}
}
class E<T> {
T getT() {
return null;
}
}
interface I<P> {}
// FILE: test.kt
fun test() {
val t = X.E.t
<!DEBUG_INFO_EXPRESSION_TYPE("(X<(I<(kotlin.Any..kotlin.Any?)>..I<(kotlin.Any..kotlin.Any?)>?), (kotlin.Any..kotlin.Any?), (I<(kotlin.Any..kotlin.Any?)>..I<(kotlin.Any..kotlin.Any?)>?)>..X<out (I<*>..I<*>?), *, out (I<*>..I<*>?)>?)")!>t<!>
t.id // should be OK
}
@@ -0,0 +1,14 @@
package
public fun test(): kotlin.Unit
public/*package*/ open class X</*0*/ B : I<P!>!, /*1*/ P : kotlin.Any!, /*2*/ A : I<P!>!> {
public/*package*/ constructor X</*0*/ B : I<P!>!, /*1*/ P : kotlin.Any!, /*2*/ A : I<P!>!>()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open fun getId(): kotlin.String!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public/*package*/ final val E: E<(X<(raw) I<kotlin.Any!>!, (raw) kotlin.Any!, (raw) I<kotlin.Any!>!>..X<out I<*>!, *, out I<*>!>?)>!
}