Load @NonNull(when=UNKNOWN) annotated type as a flexible one

This commit is contained in:
Denis Zharkov
2017-06-28 14:22:59 +03:00
parent 55b585f3d0
commit 5453f3067c
4 changed files with 16 additions and 9 deletions
@@ -7,7 +7,7 @@ public open class A {
@edu.umd.cs.findbugs.annotations.Nullable public final var field: kotlin.String?
@edu.umd.cs.findbugs.annotations.NonNull public open fun bar(): kotlin.String
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@edu.umd.cs.findbugs.annotations.PossiblyNull public open fun foo(/*0*/ @edu.umd.cs.findbugs.annotations.NonNull x: kotlin.String, /*1*/ @edu.umd.cs.findbugs.annotations.UnknownNullness y: kotlin.CharSequence?): kotlin.String?
@edu.umd.cs.findbugs.annotations.PossiblyNull public open fun foo(/*0*/ @edu.umd.cs.findbugs.annotations.NonNull x: kotlin.String, /*1*/ @edu.umd.cs.findbugs.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
}
@@ -30,5 +30,5 @@ fun main(a: A) {
a.bar()<!UNNECESSARY_NOT_NULL_ASSERTION!>!!<!>.length
a.field?.length
a.field<!UNSAFE_CALL!>.<!>length
a.field.length
}
@@ -4,10 +4,10 @@ public fun main(/*0*/ a: A): kotlin.Unit
public open class A {
public constructor 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
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 toString(): kotlin.String
}
@@ -59,11 +59,18 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati
?.takeIf { it.annotationClass?.fqNameSafe == JAVAX_NONNULL_ANNOTATION }
?: return null
return typeQualifier.allValueArguments.values.singleOrNull()?.value?.let {
enumEntryDescriptor ->
if (enumEntryDescriptor !is ClassDescriptor) return@let null
if (enumEntryDescriptor.name.asString() == "ALWAYS") NullabilityQualifier.NOT_NULL else NullabilityQualifier.NULLABLE
} ?: NullabilityQualifier.NOT_NULL
val enumEntryDescriptor =
typeQualifier.allValueArguments.values.singleOrNull()?.value
// if no argument is specified, use default value: NOT_NULL
?: return NullabilityQualifier.NOT_NULL
if (enumEntryDescriptor !is ClassDescriptor) return null
return when (enumEntryDescriptor.name.asString()) {
"ALWAYS" -> NullabilityQualifier.NOT_NULL
"MAYBE" -> NullabilityQualifier.NULLABLE
else -> null
}
}