diff --git a/src/main/java/com/android/tools/metalava/CompatibilityCheck.kt b/src/main/java/com/android/tools/metalava/CompatibilityCheck.kt index 94ac90b4b451b459a0448bc71b2f1c9fa652304c..481aae827fde73dc209788b13f03296259e3b00a 100644 --- a/src/main/java/com/android/tools/metalava/CompatibilityCheck.kt +++ b/src/main/java/com/android/tools/metalava/CompatibilityCheck.kt @@ -114,6 +114,9 @@ class CompatibilityCheck( return } val name = AnnotationItem.simpleName(oldNullnessAnnotation) + if (old.type()?.primitive == true) { + return + } report( Errors.INVALID_NULL_CONVERSION, new, "Attempted to remove $name annotation from ${describe(new)}" diff --git a/src/main/java/com/android/tools/metalava/model/ClassItem.kt b/src/main/java/com/android/tools/metalava/model/ClassItem.kt index 7dc221b37a2f718ce5bf7df0c8ea7d37b95b5066..0d072fa6103a9faaf16cf3bc35319c1f7f368eff 100644 --- a/src/main/java/com/android/tools/metalava/model/ClassItem.kt +++ b/src/main/java/com/android/tools/metalava/model/ClassItem.kt @@ -198,6 +198,8 @@ interface ClassItem : Item { /** Gets the type for this class */ fun toType(): TypeItem + override fun type(): TypeItem? = null + /** Returns true if this class has type parameters */ fun hasTypeVariables(): Boolean diff --git a/src/main/java/com/android/tools/metalava/model/FieldItem.kt b/src/main/java/com/android/tools/metalava/model/FieldItem.kt index 92e49ddf7908b50c01f5829b77dda4901652f823..e65bda9ed2b914668fc1e60f8c1409c5b939982e 100644 --- a/src/main/java/com/android/tools/metalava/model/FieldItem.kt +++ b/src/main/java/com/android/tools/metalava/model/FieldItem.kt @@ -23,7 +23,7 @@ import java.io.PrintWriter interface FieldItem : MemberItem { /** The type of this field */ - fun type(): TypeItem + override fun type(): TypeItem /** * The initial/constant value, if any. If [requireConstant] the initial value will diff --git a/src/main/java/com/android/tools/metalava/model/Item.kt b/src/main/java/com/android/tools/metalava/model/Item.kt index 9fbc546a6505b93336eaa1fe4d6739f8c01dbbd0..af2042dcec78ecfdd46419fb9adbe9b2d396a61f 100644 --- a/src/main/java/com/android/tools/metalava/model/Item.kt +++ b/src/main/java/com/android/tools/metalava/model/Item.kt @@ -210,6 +210,13 @@ interface Item { */ fun containingClass(strict: Boolean = true): ClassItem? + /** + * Returns the associated type if any. For example, for a field, property or parameter, + * this is the type of the variable; for a method, it's the return type. + * For packages, classes and compilation units, it's null. + */ + fun type(): TypeItem? + companion object { fun describe(item: Item, capitalize: Boolean = false): String { return when (item) { diff --git a/src/main/java/com/android/tools/metalava/model/MethodItem.kt b/src/main/java/com/android/tools/metalava/model/MethodItem.kt index bdb3b899ad7cdcde416caa580c921bf0903201ca..e27b682217cfb5688987db9f477949db2f8cf4b2 100644 --- a/src/main/java/com/android/tools/metalava/model/MethodItem.kt +++ b/src/main/java/com/android/tools/metalava/model/MethodItem.kt @@ -39,6 +39,8 @@ interface MethodItem : MemberItem { /** Returns the super methods that this method is overriding */ fun superMethods(): List<MethodItem> + override fun type(): TypeItem? = returnType() + /** * Like [internalName] but is the desc-portion of the internal signature, * e.g. for the method "void create(int x, int y)" the internal name of diff --git a/src/main/java/com/android/tools/metalava/model/PackageItem.kt b/src/main/java/com/android/tools/metalava/model/PackageItem.kt index 970d2eb7416f4f71cedccc022e146dd047d38214..711c0d9fd9c92e1290bd36e0cc10d15295007507 100644 --- a/src/main/java/com/android/tools/metalava/model/PackageItem.kt +++ b/src/main/java/com/android/tools/metalava/model/PackageItem.kt @@ -33,6 +33,8 @@ interface PackageItem : Item { return topLevelClasses().asSequence().flatMap { it.allClasses() } } + override fun type(): TypeItem? = null + val isDefault get() = qualifiedName().isEmpty() override fun parent(): PackageItem? = if (qualifiedName().isEmpty()) null else containingPackage() diff --git a/src/main/java/com/android/tools/metalava/model/ParameterItem.kt b/src/main/java/com/android/tools/metalava/model/ParameterItem.kt index 3610d51685185d5383f2b21522b8e60e8da907d6..a7194e6317c35689dcc102f2551faa8b1b58b0b6 100644 --- a/src/main/java/com/android/tools/metalava/model/ParameterItem.kt +++ b/src/main/java/com/android/tools/metalava/model/ParameterItem.kt @@ -24,7 +24,7 @@ interface ParameterItem : Item { fun name(): String /** The type of this field */ - fun type(): TypeItem + override fun type(): TypeItem /** The containing method */ fun containingMethod(): MethodItem diff --git a/src/main/java/com/android/tools/metalava/model/PropertyItem.kt b/src/main/java/com/android/tools/metalava/model/PropertyItem.kt index f82708c54c7172a1b0ad100970ac30ac917cf5d8..5f8478a2a6feb7048960ea0e0f13974d85d528db 100644 --- a/src/main/java/com/android/tools/metalava/model/PropertyItem.kt +++ b/src/main/java/com/android/tools/metalava/model/PropertyItem.kt @@ -21,7 +21,7 @@ import com.android.tools.metalava.model.visitors.TypeVisitor interface PropertyItem : MemberItem { /** The type of this property */ - fun type(): TypeItem + override fun type(): TypeItem override fun accept(visitor: ItemVisitor) { if (visitor.skip(this)) { diff --git a/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt b/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt index 864429d2a394fba42b2bd1459fd9f412cb588a52..e7b30ebb8bbdd90e3801bd744a7e6005c74a6138 100644 --- a/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt +++ b/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt @@ -149,6 +149,11 @@ CompatibilityCheckTest : DriverTest() { method @NonNull public Double convert4(@NonNull Float); method @Nullable public Double convert5(@Nullable Float); method @NonNull public Double convert6(@NonNull Float); + // booleans cannot reasonably be annotated with @Nullable/@NonNull but + // the compiler accepts it and we had a few of these accidentally annotated + // that way in API 28, such as Boolean.getBoolean. Make sure we don't flag + // these as incompatible changes when they're dropped. + method public void convert7(@NonNull boolean); } } """, @@ -162,6 +167,7 @@ CompatibilityCheckTest : DriverTest() { method public Double convert4(Float); method @NonNull public Double convert5(@NonNull Float); method @Nullable public Double convert6(@Nullable Float); + method public void convert7(boolean); } } """