Snap for 4916303 from 47c9e0996386a82aa79ec87145ce8829b1e97c10 to pi-qpr1-release
Change-Id: Ifb1fbb3c87ad97df932abfdd164e01250a01d56e
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 533abca..a3d9647 100644
--- a/src/main/java/com/android/tools/metalava/model/AnnotationItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/AnnotationItem.kt
@@ -24,7 +24,6 @@
import com.android.tools.lint.annotations.Extractor.ANDROID_INT_DEF
import com.android.tools.lint.annotations.Extractor.ANDROID_LONG_DEF
import com.android.tools.lint.annotations.Extractor.ANDROID_STRING_DEF
-import com.android.tools.lint.detector.api.startsWith
import com.android.tools.metalava.ANDROIDX_ANNOTATION_PREFIX
import com.android.tools.metalava.ANDROID_SUPPORT_ANNOTATION_PREFIX
import com.android.tools.metalava.JAVA_LANG_PREFIX
@@ -152,8 +151,24 @@
return true
}
- return qualifiedName.startsWith("java.lang.annotation") &&
- !qualifiedName.endsWith("SuppressWarnings")
+ // These are the significant annotations that should be included in the stubs.
+ // This is a hardcoded list here to minimize risk in the P release branch;
+ // in master the check is more general (we keep only runtime retention annotations
+ // that match the API filter, plus the retention one)
+ return when (qualifiedName) {
+ "android.view.ViewDebug.ExportedProperty",
+ "android.widget.RemoteViews.RemoteView",
+ "android.view.ViewDebug.CapturedViewProperty",
+
+ "java.lang.FunctionalInterface",
+ "java.lang.SafeVarargs",
+ "java.lang.annotation.Documented",
+ "java.lang.annotation.Inherited",
+ "java.lang.annotation.Repeatable",
+ "java.lang.annotation.Retention",
+ "java.lang.annotation.Target" -> true
+ else -> false
+ }
}
/** The simple name of an annotation, which is the annotation name (not qualified name) prefixed by @ */
@@ -425,8 +440,14 @@
qualifiedName ?: return false
return when (qualifiedName) {
+ // Hardcoded list for now; in master, this is generalized
+ "android.view.ViewDebug.ExportedProperty",
+ "android.widget.RemoteViews.RemoteView",
+ "android.view.ViewDebug.CapturedViewProperty",
+
"androidx.annotation.RecentlyNullable",
- "androidx.annotation.RecentlyNonNull" -> true
+ "androidx.annotation.RecentlyNonNull" -> return true
+
else -> qualifiedName.startsWith("java.") ||
qualifiedName.startsWith("javax.") ||
qualifiedName.startsWith("kotlin.") ||
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiAnnotationItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiAnnotationItem.kt
index 4d78346..1aaca8e 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiAnnotationItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiAnnotationItem.kt
@@ -51,14 +51,20 @@
override fun toString(): String = toSource()
override fun toSource(): String {
- val qualifiedName = qualifiedName() ?: return ""
+ val sb = StringBuilder(60)
+ appendAnnotation(sb, psiAnnotation)
+ return sb.toString()
+ }
+
+ private fun appendAnnotation(sb: StringBuilder, psiAnnotation: PsiAnnotation) {
+ val qualifiedName = AnnotationItem.mapName(codebase, psiAnnotation.qualifiedName) ?: return
val attributes = psiAnnotation.parameterList.attributes
if (attributes.isEmpty()) {
- return "@$qualifiedName"
+ sb.append("@$qualifiedName")
+ return
}
- val sb = StringBuilder(30)
sb.append("@")
sb.append(qualifiedName)
sb.append("(")
@@ -79,8 +85,6 @@
}
}
sb.append(")")
-
- return sb.toString()
}
override fun resolve(): ClassItem? {
@@ -150,6 +154,9 @@
}
sb.append('}')
}
+ is PsiAnnotation -> {
+ appendAnnotation(sb, value)
+ }
else -> {
if (value is PsiExpression) {
val source = getConstantSource(value)
diff --git a/src/test/java/com/android/tools/metalava/StubsTest.kt b/src/test/java/com/android/tools/metalava/StubsTest.kt
index 19ef97d..1edcbbf 100644
--- a/src/test/java/com/android/tools/metalava/StubsTest.kt
+++ b/src/test/java/com/android/tools/metalava/StubsTest.kt
@@ -3196,6 +3196,35 @@
}
@Test
+ fun `Functional Interfaces`() {
+ checkStubs(
+ compatibilityMode = false,
+ skipEmitPackages = emptyList(),
+ sourceFiles =
+ *arrayOf(
+ java(
+ """
+ package java.lang;
+
+ @SuppressWarnings("something") @FunctionalInterface
+ public interface MyInterface {
+ void run();
+ }
+ """
+ )
+ ),
+ warnings = "",
+ source = """
+ package java.lang;
+ @SuppressWarnings({"unchecked", "deprecation", "all"})
+ @java.lang.FunctionalInterface public interface MyInterface {
+ public void run();
+ }
+ """
+ )
+ }
+
+ @Test
fun `Check writing package info file`() {
checkStubs(
sourceFiles =