Support type arguments enhancement from type parameters bounds

Currently, only works for codeanalysis annotations because
type parameters bounds are enhanced only for them
This commit is contained in:
Denis Zharkov
2019-08-12 12:43:02 +03:00
committed by Victor Petukhov
parent e9e05c53e1
commit 392ef9aa2b
8 changed files with 180 additions and 26 deletions
@@ -0,0 +1,59 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
// FILE: A.java
import jspecify.annotations.*;
public class A<T extends @NotNull Object, E extends @Nullable Object, F extends @UnknownNullness Object> {
}
// FILE: B.java
import jspecify.annotations.*;
@DefaultNullable
public class B {
public void bar(A<String, String, String> a) {}
}
// FILE: C.java
import jspecify.annotations.*;
@DefaultNotNull
public class C {
public void bar(A<String, String, String> a) {}
}
// FILE: D.java
import jspecify.annotations.*;
@DefaultUnknownNullness
public class D {
public void bar(A<String, String, String> a) {}
}
// FILE: main.kt
fun main(
aNotNullNotNullNotNull: A<String, String, String>,
aNotNullNotNullNull: A<String, String, String?>,
aNotNullNullNotNull: A<String, String?, String>,
aNotNullNullNull: A<String, String?, String?>,
b: B, c: C, d: D
) {
b.bar(<!TYPE_MISMATCH!>aNotNullNotNullNotNull<!>)
b.bar(<!TYPE_MISMATCH!>aNotNullNotNullNull<!>)
b.bar(<!TYPE_MISMATCH!>aNotNullNullNotNull<!>)
b.bar(aNotNullNullNull)
c.bar(aNotNullNotNullNotNull)
c.bar(<!TYPE_MISMATCH!>aNotNullNotNullNull<!>)
c.bar(<!TYPE_MISMATCH!>aNotNullNullNotNull<!>)
c.bar(<!TYPE_MISMATCH!>aNotNullNullNull<!>)
d.bar(<!TYPE_MISMATCH!>aNotNullNotNullNotNull<!>)
d.bar(<!TYPE_MISMATCH!>aNotNullNotNullNull<!>)
d.bar(aNotNullNullNotNull)
d.bar(aNotNullNullNull)
}
@@ -0,0 +1,34 @@
package
public fun main(/*0*/ aNotNullNotNullNotNull: A<kotlin.String, kotlin.String, kotlin.String>, /*1*/ aNotNullNotNullNull: A<kotlin.String, kotlin.String, kotlin.String?>, /*2*/ aNotNullNullNotNull: A<kotlin.String, kotlin.String?, kotlin.String>, /*3*/ aNotNullNullNull: A<kotlin.String, kotlin.String?, kotlin.String?>, /*4*/ b: B, /*5*/ c: C, /*6*/ d: D): kotlin.Unit
public open class A</*0*/ T : @jspecify.annotations.NotNull kotlin.Any, /*1*/ E, /*2*/ F : @jspecify.annotations.UnknownNullness kotlin.Any!> {
public constructor A</*0*/ T : @jspecify.annotations.NotNull kotlin.Any, /*1*/ E, /*2*/ F : @jspecify.annotations.UnknownNullness kotlin.Any!>()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@jspecify.annotations.DefaultNullable public open class B {
public constructor B()
public open fun bar(/*0*/ a: A<kotlin.String, kotlin.String?, kotlin.String?>?): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@jspecify.annotations.DefaultNotNull public open class C {
public constructor C()
public open fun bar(/*0*/ a: A<kotlin.String, kotlin.String, kotlin.String>): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@DefaultUnknownNullness /* annotation class not found */ public open class D {
public constructor D()
public open fun bar(/*0*/ a: A<kotlin.String, kotlin.String?, kotlin.String!>!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}