Merge "Add --delete-empty-removed-signatures"
diff --git a/src/main/java/com/android/tools/metalava/ApiAnalyzer.kt b/src/main/java/com/android/tools/metalava/ApiAnalyzer.kt
index 8206879..c7dc7f0 100644
--- a/src/main/java/com/android/tools/metalava/ApiAnalyzer.kt
+++ b/src/main/java/com/android/tools/metalava/ApiAnalyzer.kt
@@ -1132,17 +1132,19 @@
}
// blow open super class and interfaces
// TODO: Consider using val superClass = cl.filteredSuperclass(filter)
- val superClass = cl.superClass()
- if (superClass != null) {
- if (superClass.isHiddenOrRemoved()) {
+ val superItems = cl.allInterfaces().toMutableSet()
+ cl.superClass()?.let { superClass -> superItems.add(superClass) }
+
+ for (superItem in superItems) {
+ if (superItem.isHiddenOrRemoved()) {
// cl is a public class declared as extending a hidden superclass.
// this is not a desired practice but it's happened, so we deal
// with it by finding the first super class which passes checkLevel for purposes of
// generating the doc & stub information, and proceeding normally.
- if (!superClass.isFromClassPath()) {
+ if (!superItem.isFromClassPath()) {
reporter.report(
Issues.HIDDEN_SUPERCLASS, cl, "Public class " + cl.qualifiedName() +
- " stripped of unavailable superclass " + superClass.qualifiedName()
+ " stripped of unavailable superclass " + superItem.qualifiedName()
)
}
} else {
@@ -1150,10 +1152,10 @@
// right (this was just done for its stub handling)
// cantStripThis(superClass, filter, notStrippable, stubImportPackages, cl, "as super class")
- if (superClass.isPrivate && !superClass.isFromClassPath()) {
+ if (superItem.isPrivate && !superItem.isFromClassPath()) {
reporter.report(
Issues.PRIVATE_SUPERCLASS, cl, "Public class " +
- cl.qualifiedName() + " extends private class " + superClass.qualifiedName()
+ cl.qualifiedName() + " extends private class " + superItem.qualifiedName()
)
}
}
diff --git a/src/test/java/com/android/tools/metalava/ApiFileTest.kt b/src/test/java/com/android/tools/metalava/ApiFileTest.kt
index c8de58a..15b532a 100644
--- a/src/test/java/com/android/tools/metalava/ApiFileTest.kt
+++ b/src/test/java/com/android/tools/metalava/ApiFileTest.kt
@@ -587,7 +587,8 @@
ARG_HIDE_PACKAGE, "test.pkg2",
ARG_HIDE, "ReferencesHidden",
ARG_HIDE, "UnavailableSymbol",
- ARG_HIDE, "HiddenTypeParameter"
+ ARG_HIDE, "HiddenTypeParameter",
+ ARG_HIDE, "HiddenSuperclass"
)
)
}
@@ -2892,6 +2893,9 @@
"""
)
),
+ expectedIssues = """
+ src/android/net/http/HttpResponseCache.java:6: warning: Public class android.net.http.HttpResponseCache stripped of unavailable superclass com.squareup.okhttp.OkCacheContainer [HiddenSuperclass]
+ """,
api = """
package android.net.http {
public final class HttpResponseCache implements java.io.Closeable {
diff --git a/src/test/java/com/android/tools/metalava/ApiLintTest.kt b/src/test/java/com/android/tools/metalava/ApiLintTest.kt
index 7eb6a78..9d01e47 100644
--- a/src/test/java/com/android/tools/metalava/ApiLintTest.kt
+++ b/src/test/java/com/android/tools/metalava/ApiLintTest.kt
@@ -1500,6 +1500,7 @@
check(
apiLint = "", // enabled
expectedIssues = """
+ src/android/pkg/MySubClass.java:5: warning: Public class android.pkg.MySubClass stripped of unavailable superclass android.pkg.MyHiddenInterface [HiddenSuperclass]
src/android/pkg/MyCallback.java:4: warning: Type of parameter list in android.pkg.MyCallback.onFoo(java.util.List<java.lang.String> list) is a nullable collection (`java.util.List`); must be non-null [NullableCollection] [See https://s.android.com/api-guidelines#methods-prefer-non-null-collections]
src/android/pkg/MyClass.java:8: warning: Return type of method android.pkg.MyClass.getList(java.util.List<java.lang.String>) is a nullable collection (`java.util.List`); must be non-null [NullableCollection] [See https://s.android.com/api-guidelines#methods-prefer-non-null-collections]
src/android/pkg/MyClass.java:12: warning: Type of field android.pkg.MyClass.STRINGS is a nullable collection (`java.lang.String[]`); must be non-null [NullableCollection] [See https://s.android.com/api-guidelines#methods-prefer-non-null-collections]
diff --git a/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt b/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt
index fbfec3a..6432ab3 100644
--- a/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt
+++ b/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt
@@ -2585,7 +2585,8 @@
/**
* @hide
*/
- @android.annotation.SystemApi
+ @SystemApi
+ @SuppressWarnings("HiddenSuperclass")
public class MediaPlayer implements SubtitleController.Listener {
}
"""
diff --git a/src/test/java/com/android/tools/metalava/HideAnnotationTest.kt b/src/test/java/com/android/tools/metalava/HideAnnotationTest.kt
index dbe50b8..dd0be8b 100644
--- a/src/test/java/com/android/tools/metalava/HideAnnotationTest.kt
+++ b/src/test/java/com/android/tools/metalava/HideAnnotationTest.kt
@@ -78,4 +78,69 @@
"""
)
}
+
+ @Test
+ fun `Using hide annotation interface order`() {
+ check(
+ expectedIssues = """
+ src/test/pkg/InterfaceWithHiddenInterfaceFirst.java:2: warning: Public class test.pkg.InterfaceWithHiddenInterfaceFirst stripped of unavailable superclass test.pkg.HiddenInterface [HiddenSuperclass]
+ src/test/pkg/InterfaceWithVisibleInterfaceFirst.java:2: warning: Public class test.pkg.InterfaceWithVisibleInterfaceFirst stripped of unavailable superclass test.pkg.HiddenInterface [HiddenSuperclass]
+ """,
+ sourceFiles = arrayOf(
+ java(
+ """
+ package test.pkg;
+ @Hide
+ public @interface Hide {}
+ """
+ ),
+ java(
+ """
+ package test.pkg;
+ @Hide
+ public interface HiddenInterface {
+ void hiddenInterfaceMethod();
+ }
+ """
+ ),
+ java(
+ """
+ package test.pkg;
+ public interface VisibleInterface {
+ void visibleInterfaceMethod();
+ }
+ """
+ ),
+ java(
+ """
+ package test.pkg;
+ public interface InterfaceWithVisibleInterfaceFirst
+ extends VisibleInterface, HiddenInterface {}
+ """
+ ),
+ java(
+ """
+ package test.pkg;
+ public interface InterfaceWithHiddenInterfaceFirst
+ extends HiddenInterface, VisibleInterface {}
+ """
+ )
+ ),
+ hideAnnotations = arrayOf(
+ "test.pkg.Hide"
+ ),
+ includeStrippedSuperclassWarnings = true,
+ api = """
+ package test.pkg {
+ public interface InterfaceWithHiddenInterfaceFirst extends test.pkg.VisibleInterface {
+ }
+ public interface InterfaceWithVisibleInterfaceFirst extends test.pkg.VisibleInterface {
+ }
+ public interface VisibleInterface {
+ method public void visibleInterfaceMethod();
+ }
+ }
+ """
+ )
+ }
}
\ No newline at end of file