Support enhancement for type parameter based types
Load them as non-flexible when a relevant type parameter has non-flexible upper bound (Currently, it only works for case of codeanalysis annotations)
This commit is contained in:
committed by
Victor Petukhov
parent
fa2578c795
commit
e9e05c53e1
+43
@@ -0,0 +1,43 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// FILE: A.java
|
||||
|
||||
import jspecify.annotations.*;
|
||||
|
||||
public class A<T extends @Nullable Object> {
|
||||
public void foo(T t) {}
|
||||
public <E extends @Nullable Object> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
|
||||
import jspecify.annotations.*;
|
||||
|
||||
@DefaultNullable
|
||||
public class B<T> {
|
||||
public void foo(T t) {}
|
||||
public <E> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun main(a1: A<Any?>, a2: A<String>, b1: B<Any?>, b2: B<String>) {
|
||||
a1.foo(null)
|
||||
a1.bar<String?>(null)
|
||||
a1.bar<String>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a1.bar<String>("")
|
||||
|
||||
a2.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a2.bar<String?>(null)
|
||||
a2.bar<String>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a2.bar<String>("")
|
||||
|
||||
b1.foo(null)
|
||||
b1.bar<String?>(null)
|
||||
b1.bar<String>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
b1.bar<String>("")
|
||||
|
||||
b2.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
b2.bar<String?>(null)
|
||||
b2.bar<String>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
b2.bar<String>("")
|
||||
}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a1: A<kotlin.Any?>, /*1*/ a2: A<kotlin.String>, /*2*/ b1: B<kotlin.Any?>, /*3*/ b2: B<kotlin.String>): kotlin.Unit
|
||||
|
||||
public open class A</*0*/ T> {
|
||||
public constructor A</*0*/ T>()
|
||||
public open fun </*0*/ E> bar(/*0*/ e: E): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(/*0*/ t: T): kotlin.Unit
|
||||
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</*0*/ T> {
|
||||
public constructor B</*0*/ T>()
|
||||
public open fun </*0*/ E> bar(/*0*/ e: E): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(/*0*/ t: T): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+4
-4
@@ -21,12 +21,12 @@ public class B<T> {
|
||||
// FILE: main.kt
|
||||
|
||||
fun main(a1: A<<!UPPER_BOUND_VIOLATED!>Any?<!>>, a2: A<String>, b1: B<<!UPPER_BOUND_VIOLATED!>Any?<!>>, b2: B<String>) {
|
||||
a1.foo(null)
|
||||
a1.bar<<!UPPER_BOUND_VIOLATED!>String?<!>>(null)
|
||||
a1.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a1.bar<<!UPPER_BOUND_VIOLATED!>String?<!>>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a1.bar<String>("")
|
||||
|
||||
a2.foo(null)
|
||||
a2.bar<<!UPPER_BOUND_VIOLATED!>String?<!>>(null)
|
||||
a2.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a2.bar<<!UPPER_BOUND_VIOLATED!>String?<!>>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a2.bar<String>("")
|
||||
|
||||
b1.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
|
||||
+2
-2
@@ -4,9 +4,9 @@ public fun main(/*0*/ a1: A<kotlin.Any?>, /*1*/ a2: A<kotlin.String>, /*2*/ b1:
|
||||
|
||||
public open class A</*0*/ T : @jspecify.annotations.NotNull kotlin.Any> {
|
||||
public constructor A</*0*/ T : @jspecify.annotations.NotNull kotlin.Any>()
|
||||
public open fun </*0*/ E : @jspecify.annotations.NotNull kotlin.Any> bar(/*0*/ e: E!): kotlin.Unit
|
||||
public open fun </*0*/ E : @jspecify.annotations.NotNull kotlin.Any> bar(/*0*/ e: E): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(/*0*/ t: T!): kotlin.Unit
|
||||
public open fun foo(/*0*/ t: T): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// FILE: A.java
|
||||
|
||||
import jspecify.annotations.*;
|
||||
|
||||
public class A<T> {
|
||||
public void foo(T t) {}
|
||||
|
||||
@DefaultNotNull
|
||||
public void bar(String s, T t) {} // t should not become not nullable
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun main(a1: A<Int>, a2: A<Int?>) {
|
||||
a1.foo(null)
|
||||
a1.foo(1)
|
||||
|
||||
a2.foo(null)
|
||||
a2.foo(1)
|
||||
|
||||
a1.bar(<!NULL_FOR_NONNULL_TYPE!>null<!>, null)
|
||||
a1.bar("", null)
|
||||
a1.bar("", 1)
|
||||
|
||||
a2.bar(<!NULL_FOR_NONNULL_TYPE!>null<!>, null)
|
||||
a2.bar("", null)
|
||||
a2.bar("", 1)
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a1: A<kotlin.Int>, /*1*/ a2: A<kotlin.Int?>): kotlin.Unit
|
||||
|
||||
public open class A</*0*/ T : kotlin.Any!> {
|
||||
public constructor A</*0*/ T : kotlin.Any!>()
|
||||
@jspecify.annotations.DefaultNotNull public open fun bar(/*0*/ s: kotlin.String, /*1*/ t: T!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(/*0*/ t: T!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
Reference in New Issue
Block a user