From e3a5680d4cf254058fd8fb56c263587543f9d9c4 Mon Sep 17 00:00:00 2001 From: Tor Norbye <tnorbye@google.com> Date: Thu, 31 Jan 2019 10:38:13 -0800 Subject: [PATCH] Ensure that stub annotations are in correct packages This should fix 123538809: Broken at //contentads/gfp/video/liveads/testing/playback:appletv4_invalid_test_build_test Change-Id: I52ad8f0afd0c2c47c30a16e47dada923cbd61f25 Fixes: 123538809 Test: Unit tests updated --- .../com/android/tools/metalava/Constants.kt | 2 ++ .../tools/metalava/RewriteAnnotations.kt | 8 ++--- .../tools/metalava/model/AnnotationItem.kt | 33 ++++++++++--------- .../android/tools/metalava/DocAnalyzerTest.kt | 2 +- .../com/android/tools/metalava/StubsTest.kt | 10 +++--- 5 files changed, 30 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/android/tools/metalava/Constants.kt b/src/main/java/com/android/tools/metalava/Constants.kt index 88cd3a7..59ffda5 100644 --- a/src/main/java/com/android/tools/metalava/Constants.kt +++ b/src/main/java/com/android/tools/metalava/Constants.kt @@ -32,6 +32,8 @@ const val ANDROID_SYSTEM_API = "android.annotation.SystemApi" const val ANDROID_REQUIRES_PERMISSION = "android.annotation.RequiresPermission" const val RECENTLY_NULLABLE = "androidx.annotation.RecentlyNullable" const val RECENTLY_NONNULL = "androidx.annotation.RecentlyNonNull" +const val ANDROID_NULLABLE = "android.annotation.Nullable" +const val ANDROID_NONNULL = "android.annotation.NonNull" const val ANDROIDX_VISIBLE_FOR_TESTING = "androidx.annotation.VisibleForTesting" const val ANDROID_SUPPORT_VISIBLE_FOR_TESTING = "android.support.annotation.VisibleForTesting" const val ATTR_OTHERWISE = "otherwise" diff --git a/src/main/java/com/android/tools/metalava/RewriteAnnotations.kt b/src/main/java/com/android/tools/metalava/RewriteAnnotations.kt index fb56a10..d256e10 100644 --- a/src/main/java/com/android/tools/metalava/RewriteAnnotations.kt +++ b/src/main/java/com/android/tools/metalava/RewriteAnnotations.kt @@ -123,10 +123,10 @@ class RewriteAnnotations { */ private fun hasSourceRetention(codebase: Codebase?, qualifiedName: String): Boolean { when { - qualifiedName == "androidx.annotation.RecentlyNullable" || - qualifiedName == "androidx.annotation.RecentlyNonNull" || - qualifiedName == "android.annotation.Nullable" || - qualifiedName == "android.annotation.NonNull" -> return false + qualifiedName == RECENTLY_NULLABLE || + qualifiedName == RECENTLY_NONNULL || + qualifiedName == ANDROID_NULLABLE || + qualifiedName == ANDROID_NONNULL -> return false qualifiedName.startsWith("androidx.annotation.") -> return true } diff --git a/src/main/java/com/android/tools/metalava/model/AnnotationItem.kt b/src/main/java/com/android/tools/metalava/model/AnnotationItem.kt index a7c04ed..ae61fdd 100644 --- a/src/main/java/com/android/tools/metalava/model/AnnotationItem.kt +++ b/src/main/java/com/android/tools/metalava/model/AnnotationItem.kt @@ -27,6 +27,8 @@ import com.android.tools.lint.annotations.Extractor.ANDROID_STRING_DEF import com.android.tools.metalava.ANDROIDX_ANNOTATION_PREFIX import com.android.tools.metalava.ANDROIDX_NONNULL import com.android.tools.metalava.ANDROIDX_NULLABLE +import com.android.tools.metalava.ANDROID_NONNULL +import com.android.tools.metalava.ANDROID_NULLABLE import com.android.tools.metalava.ANDROID_SUPPORT_ANNOTATION_PREFIX import com.android.tools.metalava.Compatibility import com.android.tools.metalava.JAVA_LANG_PREFIX @@ -238,17 +240,18 @@ interface AnnotationItem { // We only change recently/newly nullable annotation in stubs RECENTLY_NULLABLE -> return if (target == AnnotationTarget.SDK_STUBS_FILE) qualifiedName else ANDROIDX_NULLABLE RECENTLY_NONNULL -> return if (target == AnnotationTarget.SDK_STUBS_FILE) qualifiedName else ANDROIDX_NONNULL - "android.annotation.Nullable" -> return if (target == AnnotationTarget.SDK_STUBS_FILE) qualifiedName else ANDROIDX_NULLABLE - "android.annotation.NonNull" -> return if (target == AnnotationTarget.SDK_STUBS_FILE) qualifiedName else ANDROIDX_NONNULL - ANDROIDX_NULLABLE -> return if (target == AnnotationTarget.SDK_STUBS_FILE) "android.annotation.Nullable" else ANDROIDX_NULLABLE - ANDROIDX_NONNULL -> return if (target == AnnotationTarget.SDK_STUBS_FILE) "android.annotation.NonNull" else ANDROIDX_NONNULL - - "android.support.annotation.NonNull" -> return ANDROIDX_NONNULL - "android.support.annotation.Nullable" -> return ANDROIDX_NULLABLE - "libcore.util.NonNull" -> return ANDROIDX_NONNULL - "libcore.util.Nullable" -> return ANDROIDX_NULLABLE - "org.jetbrains.annotations.NotNull" -> return ANDROIDX_NONNULL - "org.jetbrains.annotations.Nullable" -> return ANDROIDX_NULLABLE + + ANDROIDX_NULLABLE, + ANDROID_NULLABLE, + "android.support.annotation.Nullable", + "libcore.util.Nullable", + "org.jetbrains.annotations.Nullable" -> return if (target == AnnotationTarget.SDK_STUBS_FILE) ANDROID_NULLABLE else ANDROIDX_NULLABLE + + ANDROIDX_NONNULL, + ANDROID_NONNULL, + "android.support.annotation.NonNull", + "libcore.util.NonNull", + "org.jetbrains.annotations.NotNull" -> return if (target == AnnotationTarget.SDK_STUBS_FILE) ANDROID_NONNULL else ANDROIDX_NONNULL // Typedefs "android.support.annotation.IntDef", @@ -408,8 +411,8 @@ interface AnnotationItem { // @android.annotation.Nullable and NonNullable specially recognized annotations by the Kotlin // compiler 1.3 and above: they always go in the stubs. - if (qualifiedName == "android.annotation.Nullable" || - qualifiedName == "android.annotation.NonNull" || + if (qualifiedName == ANDROID_NULLABLE || + qualifiedName == ANDROID_NONNULL || qualifiedName == ANDROIDX_NULLABLE || qualifiedName == ANDROIDX_NONNULL ) { @@ -424,8 +427,8 @@ interface AnnotationItem { // @RecentlyNullable and @RecentlyNonNull are specially recognized annotations by the Kotlin // compiler: they always go in the stubs. - if (qualifiedName == "androidx.annotation.RecentlyNullable" || - qualifiedName == "androidx.annotation.RecentlyNonNull" + if (qualifiedName == RECENTLY_NULLABLE || + qualifiedName == RECENTLY_NONNULL ) { return ANNOTATION_IN_ALL_STUBS } diff --git a/src/test/java/com/android/tools/metalava/DocAnalyzerTest.kt b/src/test/java/com/android/tools/metalava/DocAnalyzerTest.kt index ea5b13f..d309a11 100644 --- a/src/test/java/com/android/tools/metalava/DocAnalyzerTest.kt +++ b/src/test/java/com/android/tools/metalava/DocAnalyzerTest.kt @@ -1333,7 +1333,7 @@ class DocAnalyzerTest : DriverTest() { * @deprecated Blah blah blah 1 */ @Deprecated - @androidx.annotation.NonNull + @android.annotation.NonNull public java.lang.String toString() { throw new RuntimeException("Stub!"); } /** * My description diff --git a/src/test/java/com/android/tools/metalava/StubsTest.kt b/src/test/java/com/android/tools/metalava/StubsTest.kt index fca7dea..da65e5c 100644 --- a/src/test/java/com/android/tools/metalava/StubsTest.kt +++ b/src/test/java/com/android/tools/metalava/StubsTest.kt @@ -1352,17 +1352,17 @@ class StubsTest : DriverTest() { /** My class doc */ @SuppressWarnings({"unchecked", "deprecation", "all"}) public final class Kotlin extends test.pkg.Parent { - public Kotlin(@androidx.annotation.NonNull java.lang.String property1, int arg2) { throw new RuntimeException("Stub!"); } - @androidx.annotation.NonNull + public Kotlin(@android.annotation.NonNull java.lang.String property1, int arg2) { throw new RuntimeException("Stub!"); } + @android.annotation.NonNull public java.lang.String method() { throw new RuntimeException("Stub!"); } /** My method doc */ public void otherMethod(boolean ok, int times) { throw new RuntimeException("Stub!"); } /** property doc */ - @androidx.annotation.Nullable + @android.annotation.Nullable public java.lang.String getProperty2() { throw new RuntimeException("Stub!"); } /** property doc */ - public void setProperty2(@androidx.annotation.Nullable java.lang.String p) { throw new RuntimeException("Stub!"); } - @androidx.annotation.NonNull + public void setProperty2(@android.annotation.Nullable java.lang.String p) { throw new RuntimeException("Stub!"); } + @android.annotation.NonNull public java.lang.String getProperty1() { throw new RuntimeException("Stub!"); } public int someField2; } -- GitLab