Support @NonNull(when = NEVER) nullability annotation
#KT-20131 Fixed
This commit is contained in:
@@ -0,0 +1,41 @@
|
|||||||
|
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||||
|
// FILE: MyNullable.java
|
||||||
|
import javax.annotation.*;
|
||||||
|
import java.lang.annotation.Documented;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
|
||||||
|
import javax.annotation.meta.TypeQualifierNickname;
|
||||||
|
import javax.annotation.meta.When;
|
||||||
|
|
||||||
|
@Documented
|
||||||
|
@TypeQualifierNickname
|
||||||
|
@Nonnull(when = When.NEVER)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface MyNullable {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: A.java
|
||||||
|
|
||||||
|
import javax.annotation.*;
|
||||||
|
import javax.annotation.meta.When;
|
||||||
|
|
||||||
|
public class A {
|
||||||
|
@Nonnull(when = When.NEVER) public String field = null;
|
||||||
|
|
||||||
|
@MyNullable
|
||||||
|
public String foo(@Nonnull(when = When.NEVER) String x, @MyNullable CharSequence y) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// FILE: main.kt
|
||||||
|
|
||||||
|
fun main(a: A) {
|
||||||
|
a.foo("", null)?.length
|
||||||
|
a.foo("", null)<!UNSAFE_CALL!>.<!>length
|
||||||
|
a.foo(null, "")<!UNSAFE_CALL!>.<!>length
|
||||||
|
|
||||||
|
a.field?.length
|
||||||
|
a.field<!UNSAFE_CALL!>.<!>length
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public fun main(/*0*/ a: A): kotlin.Unit
|
||||||
|
|
||||||
|
public open class A {
|
||||||
|
public constructor A()
|
||||||
|
@javax.annotation.Nonnull(when = When.NEVER) public final var field: kotlin.String?
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
@MyNullable public open fun foo(/*0*/ @javax.annotation.Nonnull(when = When.NEVER) x: kotlin.String?, /*1*/ @MyNullable 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
|
||||||
|
}
|
||||||
|
|
||||||
|
@kotlin.annotation.MustBeDocumented @javax.annotation.meta.TypeQualifierNickname @javax.annotation.Nonnull(when = When.NEVER) @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) public final annotation class MyNullable : kotlin.Annotation {
|
||||||
|
public constructor MyNullable()
|
||||||
|
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
|
||||||
|
}
|
||||||
+1
-1
@@ -7,7 +7,7 @@ public open class A {
|
|||||||
@javax.annotation.Nonnull(when = When.UNKNOWN) public final var field: kotlin.String!
|
@javax.annotation.Nonnull(when = When.UNKNOWN) public final var field: kotlin.String!
|
||||||
@javax.annotation.Nonnull public open fun bar(): kotlin.String
|
@javax.annotation.Nonnull public open fun bar(): kotlin.String
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
@javax.annotation.Nonnull(when = When.MAYBE) public open fun foo(/*0*/ @javax.annotation.Nonnull(when = When.ALWAYS) x: kotlin.String, /*1*/ @javax.annotation.Nonnull(when = When.NEVER) y: kotlin.CharSequence!): kotlin.String?
|
@javax.annotation.Nonnull(when = When.MAYBE) public open fun foo(/*0*/ @javax.annotation.Nonnull(when = When.ALWAYS) x: kotlin.String, /*1*/ @javax.annotation.Nonnull(when = When.NEVER) y: kotlin.CharSequence?): kotlin.String?
|
||||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ public open class A {
|
|||||||
@javax.annotation.Nonnull(when = When.UNKNOWN) public final var field: kotlin.String!
|
@javax.annotation.Nonnull(when = When.UNKNOWN) public final var field: kotlin.String!
|
||||||
@javax.annotation.Nonnull public open fun bar(): kotlin.String
|
@javax.annotation.Nonnull public open fun bar(): kotlin.String
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
@javax.annotation.Nonnull(when = When.MAYBE) public open fun foo(/*0*/ @javax.annotation.Nonnull(when = When.ALWAYS) x: kotlin.String, /*1*/ @javax.annotation.Nonnull(when = When.NEVER) y: kotlin.CharSequence!): kotlin.String?
|
@javax.annotation.Nonnull(when = When.MAYBE) public open fun foo(/*0*/ @javax.annotation.Nonnull(when = When.ALWAYS) x: kotlin.String, /*1*/ @javax.annotation.Nonnull(when = When.NEVER) y: kotlin.CharSequence?): kotlin.String?
|
||||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
}
|
}
|
||||||
|
|||||||
+6
@@ -66,6 +66,12 @@ public class ForeignAnnotationsNoAnnotationInClasspathTestGenerated extends Abst
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("jsr305NonNullNever.kt")
|
||||||
|
public void testJsr305NonNullNever() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("jsr305NullabilityNicknames.kt")
|
@TestMetadata("jsr305NullabilityNicknames.kt")
|
||||||
public void testJsr305NullabilityNicknames() throws Exception {
|
public void testJsr305NullabilityNicknames() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt");
|
||||||
|
|||||||
+6
@@ -66,6 +66,12 @@ public class ForeignAnnotationsNoAnnotationInClasspathWithFastClassReadingTestGe
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("jsr305NonNullNever.kt")
|
||||||
|
public void testJsr305NonNullNever() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("jsr305NullabilityNicknames.kt")
|
@TestMetadata("jsr305NullabilityNicknames.kt")
|
||||||
public void testJsr305NullabilityNicknames() throws Exception {
|
public void testJsr305NullabilityNicknames() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt");
|
||||||
|
|||||||
@@ -66,6 +66,12 @@ public class ForeignAnnotationsTestGenerated extends AbstractForeignAnnotationsT
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("jsr305NonNullNever.kt")
|
||||||
|
public void testJsr305NonNullNever() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("jsr305NullabilityNicknames.kt")
|
@TestMetadata("jsr305NullabilityNicknames.kt")
|
||||||
public void testJsr305NullabilityNicknames() throws Exception {
|
public void testJsr305NullabilityNicknames() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt");
|
||||||
|
|||||||
+6
@@ -66,6 +66,12 @@ public class JavacForeignAnnotationsTestGenerated extends AbstractJavacForeignAn
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("jsr305NonNullNever.kt")
|
||||||
|
public void testJsr305NonNullNever() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NonNullNever.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("jsr305NullabilityNicknames.kt")
|
@TestMetadata("jsr305NullabilityNicknames.kt")
|
||||||
public void testJsr305NullabilityNicknames() throws Exception {
|
public void testJsr305NullabilityNicknames() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotations/tests/jsr305NullabilityNicknames.kt");
|
||||||
|
|||||||
+1
-1
@@ -62,7 +62,7 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati
|
|||||||
|
|
||||||
return when (enumEntryDescriptor.name.asString()) {
|
return when (enumEntryDescriptor.name.asString()) {
|
||||||
"ALWAYS" -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NOT_NULL)
|
"ALWAYS" -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NOT_NULL)
|
||||||
"MAYBE" -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NULLABLE)
|
"MAYBE", "NEVER" -> NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NULLABLE)
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user