Support compiler flag -Xcodeanalysis-annotations
This commit is contained in:
committed by
Victor Petukhov
parent
c734bac676
commit
f3a490ee16
+52
@@ -0,0 +1,52 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// CODE_ANALYSIS_STATE ignore
|
||||
// FILE: A.java
|
||||
|
||||
import jspecify.annotations.*;
|
||||
|
||||
public class A {
|
||||
@Nullable public String field = null;
|
||||
|
||||
@Nullable
|
||||
public String foo(@NotNull String x, @UnknownNullness CharSequence y) {
|
||||
return "";
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String bar() {
|
||||
return "";
|
||||
}
|
||||
|
||||
@DefaultNotNull
|
||||
public String everythingNotNullable(String x) { return ""; }
|
||||
|
||||
@DefaultNullable
|
||||
public String everythingNullable(String x) { return ""; }
|
||||
|
||||
@DefaultNullnessUnknown
|
||||
public String everythingUnknown(String x) { return ""; }
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun main(a: A) {
|
||||
a.foo("", null)?.length
|
||||
a.foo("", null).length
|
||||
a.foo(null, "").length
|
||||
|
||||
a.bar().length
|
||||
a.bar()!!.length
|
||||
|
||||
a.field?.length
|
||||
a.field.length
|
||||
|
||||
a.everythingNotNullable(null)?.length
|
||||
a.everythingNotNullable(null).length
|
||||
a.everythingNotNullable("").length
|
||||
|
||||
a.everythingNullable(null).length
|
||||
a.everythingNullable(null)?.length
|
||||
|
||||
a.everythingUnknown(null).length
|
||||
a.everythingUnknown(null)?.length
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a: A): kotlin.Unit
|
||||
|
||||
public open class A {
|
||||
public constructor A()
|
||||
@jspecify.annotations.Nullable public final var field: kotlin.String!
|
||||
@jspecify.annotations.NotNull public open fun bar(): kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
@jspecify.annotations.DefaultNotNull public open fun everythingNotNullable(/*0*/ x: kotlin.String!): kotlin.String!
|
||||
@jspecify.annotations.DefaultNullable public open fun everythingNullable(/*0*/ x: kotlin.String!): kotlin.String!
|
||||
@jspecify.annotations.DefaultNullnessUnknown public open fun everythingUnknown(/*0*/ x: kotlin.String!): kotlin.String!
|
||||
@jspecify.annotations.Nullable public open fun foo(/*0*/ @jspecify.annotations.NotNull x: kotlin.String!, /*1*/ @jspecify.annotations.UnknownNullness y: kotlin.CharSequence!): kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
Vendored
+81
@@ -0,0 +1,81 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// CODE_ANALYSIS_STATE warn
|
||||
// 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.*;
|
||||
|
||||
public class B {
|
||||
public void superAsIs(A<? super CharSequence, ? super CharSequence, ? super CharSequence> a) {}
|
||||
public void superNotNull(A<? super @NotNull CharSequence, ? super @NotNull CharSequence, ? super @NotNull CharSequence> a) {}
|
||||
public void superNullable(A<? super @Nullable CharSequence, ? super @Nullable CharSequence, ? super @Nullable CharSequence> a) {}
|
||||
|
||||
public void extendsAsIs(A<? extends CharSequence, ? extends CharSequence, ? extends CharSequence> a) {}
|
||||
public void extendsNotNull(A<? extends @NotNull CharSequence, ? extends @NotNull CharSequence, ? extends @NotNull CharSequence> a) {}
|
||||
public void extendsNullable(A<? extends @Nullable CharSequence, ? extends @Nullable CharSequence, ? extends @Nullable CharSequence> a) {}
|
||||
|
||||
public void noBounds(A<?, ?, ?> 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?>,
|
||||
|
||||
aAnyNotNullNotNullNotNull: A<Any, Any, Any>,
|
||||
aAnyNotNullNotNullNull: A<Any, Any, Any?>,
|
||||
aAnyNotNullNullNotNull: A<Any, Any?, Any>,
|
||||
aAnyNotNullNullNull: A<Any, Any?, Any?>,
|
||||
b: B
|
||||
) {
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b.superAsIs(aAnyNotNullNotNullNotNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b.superAsIs(aAnyNotNullNotNullNull)
|
||||
b.superAsIs(aAnyNotNullNullNotNull)
|
||||
b.superAsIs(aAnyNotNullNullNull)
|
||||
|
||||
b.superNotNull(aAnyNotNullNotNullNotNull)
|
||||
b.superNotNull(aAnyNotNullNotNullNull)
|
||||
b.superNotNull(aAnyNotNullNullNotNull)
|
||||
b.superNotNull(aAnyNotNullNullNull)
|
||||
|
||||
// TODO: Bound for the first argument in "superNullable" contradicts to declared nullability of the parameter
|
||||
// Do we need to ignore such arguments' nullability?
|
||||
b.superNullable(aAnyNotNullNotNullNotNull)
|
||||
b.superNullable(aAnyNotNullNotNullNull)
|
||||
b.superNullable(aAnyNotNullNullNotNull)
|
||||
b.superNullable(aAnyNotNullNullNull)
|
||||
|
||||
b.extendsAsIs(aNotNullNotNullNotNull)
|
||||
b.extendsAsIs(aNotNullNotNullNull)
|
||||
b.extendsAsIs(aNotNullNullNotNull)
|
||||
b.extendsAsIs(aNotNullNullNull)
|
||||
|
||||
b.extendsNotNull(aNotNullNotNullNotNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b.extendsNotNull(aNotNullNotNullNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b.extendsNotNull(aNotNullNullNotNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b.extendsNotNull(aNotNullNullNull)
|
||||
|
||||
b.extendsNullable(aNotNullNotNullNotNull)
|
||||
b.extendsNullable(aNotNullNotNullNull)
|
||||
b.extendsNullable(aNotNullNullNotNull)
|
||||
b.extendsNullable(aNotNullNullNull)
|
||||
|
||||
b.noBounds(aNotNullNotNullNotNull)
|
||||
b.noBounds(aNotNullNotNullNull)
|
||||
b.noBounds(aNotNullNullNotNull)
|
||||
b.noBounds(aNotNullNullNull)
|
||||
}
|
||||
Vendored
+24
@@ -0,0 +1,24 @@
|
||||
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*/ aAnyNotNullNotNullNotNull: A<kotlin.Any, kotlin.Any, kotlin.Any>, /*5*/ aAnyNotNullNotNullNull: A<kotlin.Any, kotlin.Any, kotlin.Any?>, /*6*/ aAnyNotNullNullNotNull: A<kotlin.Any, kotlin.Any?, kotlin.Any>, /*7*/ aAnyNotNullNullNull: A<kotlin.Any, kotlin.Any?, kotlin.Any?>, /*8*/ b: B): kotlin.Unit
|
||||
|
||||
public open class A</*0*/ T : @jspecify.annotations.NotNull kotlin.Any!, /*1*/ E : @jspecify.annotations.Nullable kotlin.Any!, /*2*/ F : @jspecify.annotations.UnknownNullness kotlin.Any!> {
|
||||
public constructor A</*0*/ T : @jspecify.annotations.NotNull kotlin.Any!, /*1*/ E : @jspecify.annotations.Nullable kotlin.Any!, /*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
|
||||
}
|
||||
|
||||
public open class B {
|
||||
public constructor B()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun extendsAsIs(/*0*/ a: A<out kotlin.CharSequence!, out kotlin.CharSequence!, out kotlin.CharSequence!>!): kotlin.Unit
|
||||
public open fun extendsNotNull(/*0*/ a: A<out @jspecify.annotations.NotNull kotlin.CharSequence!, out @jspecify.annotations.NotNull kotlin.CharSequence!, out @jspecify.annotations.NotNull kotlin.CharSequence!>!): kotlin.Unit
|
||||
public open fun extendsNullable(/*0*/ a: A<out @jspecify.annotations.Nullable kotlin.CharSequence!, out @jspecify.annotations.Nullable kotlin.CharSequence!, out @jspecify.annotations.Nullable kotlin.CharSequence!>!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open fun noBounds(/*0*/ a: A<*, *, *>!): kotlin.Unit
|
||||
public open fun superAsIs(/*0*/ a: A<in kotlin.CharSequence!, in kotlin.CharSequence!, in kotlin.CharSequence!>!): kotlin.Unit
|
||||
public open fun superNotNull(/*0*/ a: A<in @jspecify.annotations.NotNull kotlin.CharSequence!, in @jspecify.annotations.NotNull kotlin.CharSequence!, in @jspecify.annotations.NotNull kotlin.CharSequence!>!): kotlin.Unit
|
||||
public open fun superNullable(/*0*/ a: A<in @jspecify.annotations.Nullable kotlin.CharSequence!, in @jspecify.annotations.Nullable kotlin.CharSequence!, in @jspecify.annotations.Nullable kotlin.CharSequence!>!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// CODE_ANALYSIS_STATE warn
|
||||
// FILE: A.java
|
||||
|
||||
import jspecify.annotations.*;
|
||||
|
||||
@DefaultNotNull
|
||||
public class A {
|
||||
public String defaultField = "";
|
||||
@Nullable public String field = null;
|
||||
|
||||
public String everythingNotNullable(String x) { return ""; }
|
||||
|
||||
@DefaultNullable
|
||||
public String everythingNullable(String x) { return ""; }
|
||||
|
||||
@DefaultNullnessUnknown
|
||||
public String everythingUnknown(String x) { return ""; }
|
||||
|
||||
@DefaultNullable
|
||||
public String mixed(@NotNull String x) { return ""; }
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun main(a: A) {
|
||||
a.everythingNotNullable(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)<!UNNECESSARY_SAFE_CALL!>?.<!>length
|
||||
a.everythingNotNullable(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>).length
|
||||
a.everythingNotNullable("").length
|
||||
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.everythingNullable(null)<!>.length
|
||||
a.everythingNullable(null)?.length
|
||||
|
||||
a.everythingUnknown(null).length
|
||||
a.everythingUnknown(null)?.length
|
||||
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.mixed(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)<!>.length
|
||||
a.mixed(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)?.length
|
||||
a.mixed("")?.length
|
||||
|
||||
a.defaultField<!UNNECESSARY_SAFE_CALL!>?.<!>length
|
||||
a.defaultField.length
|
||||
|
||||
a.field?.length
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.field<!>.length
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a: A): kotlin.Unit
|
||||
|
||||
@jspecify.annotations.DefaultNotNull public open class A {
|
||||
public constructor A()
|
||||
public final var defaultField: kotlin.String!
|
||||
@jspecify.annotations.Nullable public final var field: kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun everythingNotNullable(/*0*/ x: kotlin.String!): kotlin.String!
|
||||
@jspecify.annotations.DefaultNullable public open fun everythingNullable(/*0*/ x: kotlin.String!): kotlin.String!
|
||||
@jspecify.annotations.DefaultNullnessUnknown public open fun everythingUnknown(/*0*/ x: kotlin.String!): kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
@jspecify.annotations.DefaultNullable public open fun mixed(/*0*/ @jspecify.annotations.NotNull x: kotlin.String!): kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
Vendored
+50
@@ -0,0 +1,50 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// CODE_ANALYSIS_STATE warn
|
||||
// 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)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
a1.bar<String>(null)
|
||||
a1.bar<String>("")
|
||||
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
a2.foo(null)
|
||||
a2.bar<String?>(null)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
a2.bar<String>(null)
|
||||
a2.bar<String>("")
|
||||
|
||||
b1.foo(null)
|
||||
b1.bar<String?>(null)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b1.bar<String>(null)
|
||||
b1.bar<String>("")
|
||||
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b2.foo(null)
|
||||
b2.bar<String?>(null)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b2.bar<String>(null)
|
||||
b2.bar<String>("")
|
||||
}
|
||||
Vendored
+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 : @jspecify.annotations.Nullable kotlin.Any!> {
|
||||
public constructor A</*0*/ T : @jspecify.annotations.Nullable kotlin.Any!>()
|
||||
public open fun </*0*/ E : @jspecify.annotations.Nullable 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 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 : kotlin.Any!> {
|
||||
public constructor B</*0*/ T : kotlin.Any!>()
|
||||
public open fun </*0*/ E : 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 override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// CODE_ANALYSIS_STATE warn
|
||||
// FILE: A.java
|
||||
|
||||
import jspecify.annotations.*;
|
||||
|
||||
public class A {
|
||||
@Nullable public String field = null;
|
||||
|
||||
@Nullable
|
||||
public String foo(@NotNull String x, @UnknownNullness CharSequence y) {
|
||||
return "";
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String bar() {
|
||||
return "";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun main(a: A) {
|
||||
a.foo("", null)?.length
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.foo("", null)<!>.length
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.foo(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>, "")<!>.length
|
||||
|
||||
a.bar().length
|
||||
a.bar()<!UNNECESSARY_NOT_NULL_ASSERTION!>!!<!>.length
|
||||
|
||||
a.field?.length
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.field<!>.length
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a: A): kotlin.Unit
|
||||
|
||||
public open class A {
|
||||
public constructor A()
|
||||
@jspecify.annotations.Nullable public final var field: kotlin.String!
|
||||
@jspecify.annotations.NotNull public open fun bar(): kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
@jspecify.annotations.Nullable public open fun foo(/*0*/ @jspecify.annotations.NotNull x: kotlin.String!, /*1*/ @jspecify.annotations.UnknownNullness y: kotlin.CharSequence!): kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// CODE_ANALYSIS_STATE warn
|
||||
// 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
|
||||
) {
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b.bar(aNotNullNotNullNotNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b.bar(aNotNullNotNullNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b.bar(aNotNullNullNotNull)
|
||||
b.bar(aNotNullNullNull)
|
||||
|
||||
c.bar(aNotNullNotNullNotNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
c.bar(aNotNullNotNullNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
c.bar(aNotNullNullNotNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
c.bar(aNotNullNullNull)
|
||||
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
d.bar(aNotNullNotNullNotNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
d.bar(aNotNullNotNullNull)
|
||||
d.bar(aNotNullNullNotNull)
|
||||
d.bar(aNotNullNullNull)
|
||||
}
|
||||
+34
@@ -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 : @jspecify.annotations.Nullable kotlin.Any!, /*2*/ F : @jspecify.annotations.UnknownNullness kotlin.Any!> {
|
||||
public constructor A</*0*/ T : @jspecify.annotations.NotNull kotlin.Any!, /*1*/ E : @jspecify.annotations.Nullable kotlin.Any!, /*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
|
||||
}
|
||||
Vendored
+49
@@ -0,0 +1,49 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// CODE_ANALYSIS_STATE warn
|
||||
// FILE: A.java
|
||||
|
||||
import jspecify.annotations.*;
|
||||
|
||||
public class A<T extends @NotNull Object> {
|
||||
public void foo(T t) {}
|
||||
public <E extends @NotNull Object> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
|
||||
import jspecify.annotations.*;
|
||||
|
||||
@DefaultNotNull
|
||||
public class B<T> {
|
||||
public void foo(T t) {}
|
||||
public <E> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
// TODO: UPPER_BOUND_VIOLATED_WARNING should be reported
|
||||
fun main(a1: A<Any?>, a2: A<String>, b1: B<Any?>, b2: B<String>) {
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
a1.foo(null)
|
||||
// TODO: UPPER_BOUND_VIOLATED_WARNING should be reported
|
||||
a1.bar<String?>(null)
|
||||
a1.bar<String>("")
|
||||
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
a2.foo(null)
|
||||
// TODO: UPPER_BOUND_VIOLATED_WARNING should be reported
|
||||
a2.bar<String?>(null)
|
||||
a2.bar<String>("")
|
||||
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b1.foo(null)
|
||||
// TODO: UPPER_BOUND_VIOLATED_WARNING should be reported
|
||||
b1.bar<String?>(null)
|
||||
b1.bar<String>("")
|
||||
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b2.foo(null)
|
||||
// TODO: UPPER_BOUND_VIOLATED_WARNING should be reported
|
||||
b2.bar<String?>(null)
|
||||
b2.bar<String>("")
|
||||
}
|
||||
Vendored
+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 : @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 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.DefaultNotNull public open class B</*0*/ T : kotlin.Any!> {
|
||||
public constructor B</*0*/ T : kotlin.Any!>()
|
||||
public open fun </*0*/ E : 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 override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// CODE_ANALYSIS_STATE warn
|
||||
// FILE: A.java
|
||||
|
||||
import codeanalysis.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(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>, null)
|
||||
a1.bar("", null)
|
||||
a1.bar("", 1)
|
||||
|
||||
a2.bar(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>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!>()
|
||||
@codeanalysis.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
|
||||
}
|
||||
Vendored
+42
@@ -0,0 +1,42 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// CODE_ANALYSIS_STATE warn
|
||||
// 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.*;
|
||||
|
||||
public class B {
|
||||
@DefaultNotNull
|
||||
public void noBoundsNotNull(A<?, ?, ?> a) {}
|
||||
@DefaultNullable
|
||||
public void noBoundsNullable(A<?, ?, ?> 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
|
||||
) {
|
||||
b.noBoundsNotNull(aNotNullNotNullNotNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b.noBoundsNotNull(aNotNullNotNullNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b.noBoundsNotNull(aNotNullNullNotNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b.noBoundsNotNull(aNotNullNullNull)
|
||||
|
||||
b.noBoundsNullable(aNotNullNotNullNotNull)
|
||||
b.noBoundsNullable(aNotNullNotNullNull)
|
||||
b.noBoundsNullable(aNotNullNullNotNull)
|
||||
b.noBoundsNullable(aNotNullNullNull)
|
||||
}
|
||||
Vendored
+19
@@ -0,0 +1,19 @@
|
||||
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): kotlin.Unit
|
||||
|
||||
public open class A</*0*/ T : @jspecify.annotations.NotNull kotlin.Any!, /*1*/ E : @jspecify.annotations.Nullable kotlin.Any!, /*2*/ F : @jspecify.annotations.UnknownNullness kotlin.Any!> {
|
||||
public constructor A</*0*/ T : @jspecify.annotations.NotNull kotlin.Any!, /*1*/ E : @jspecify.annotations.Nullable kotlin.Any!, /*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
|
||||
}
|
||||
|
||||
public open class B {
|
||||
public constructor B()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
@jspecify.annotations.DefaultNotNull public open fun noBoundsNotNull(/*0*/ a: A<*, *, *>!): kotlin.Unit
|
||||
@jspecify.annotations.DefaultNullable public open fun noBoundsNullable(/*0*/ a: A<*, *, *>!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
Reference in New Issue
Block a user