check-flagged-apis: record interfaces when parsing classes

Extend ClassSymbol with a list of the interfaces that class implements.
This will be used in a follow-up CL to improve the logic that checks if
a class member exists in the api-versions.xml data.

Bug: 334870672
Test: atest --host check-flagged-apis-test
Change-Id: I4db7ff47c3ce40ca892cb872810dd559426dfcb8
diff --git a/tools/check-flagged-apis/src/com/android/checkflaggedapis/Main.kt b/tools/check-flagged-apis/src/com/android/checkflaggedapis/Main.kt
index 4ff9880..0f58aa5 100644
--- a/tools/check-flagged-apis/src/com/android/checkflaggedapis/Main.kt
+++ b/tools/check-flagged-apis/src/com/android/checkflaggedapis/Main.kt
@@ -58,8 +58,8 @@
   companion object {
     private val FORBIDDEN_CHARS = listOf('#', '$', '.')
 
-    fun createClass(clazz: String): Symbol {
-      return ClassSymbol(toInternalFormat(clazz))
+    fun createClass(clazz: String, interfaces: Set<String>): Symbol {
+      return ClassSymbol(toInternalFormat(clazz), interfaces.map { toInternalFormat(it) }.toSet())
     }
 
     fun createField(clazz: String, field: String): Symbol {
@@ -83,7 +83,7 @@
   abstract fun toPrettyString(): String
 }
 
-internal data class ClassSymbol(val clazz: String) : Symbol() {
+internal data class ClassSymbol(val clazz: String, val interfaces: Set<String>) : Symbol() {
   override fun toPrettyString(): String = "$clazz"
 }
 
@@ -195,7 +195,10 @@
       object : BaseItemVisitor() {
         override fun visitClass(cls: ClassItem) {
           getFlagOrNull(cls)?.let { flag ->
-            val symbol = Symbol.createClass(cls.baselineElementId())
+            val symbol =
+                Symbol.createClass(
+                    cls.baselineElementId(),
+                    cls.allInterfaces().map { it.baselineElementId() }.toSet())
             output.add(Pair(symbol, flag))
           }
         }
@@ -257,7 +260,19 @@
         requireNotNull(cls.getAttribute("name")) {
           "Bad XML: <class> element without name attribute"
         }
-    output.add(Symbol.createClass(className))
+    val interfaces = mutableSetOf<String>()
+    val children = cls.getChildNodes()
+    for (j in 0.rangeUntil(children.getLength())) {
+      val child = children.item(j)
+      if (child.getNodeName() == "implements") {
+        val interfaceName =
+            requireNotNull(child.getAttribute("name")) {
+              "Bad XML: <implements> element without name attribute"
+            }
+        interfaces.add(interfaceName)
+      }
+    }
+    output.add(Symbol.createClass(className, interfaces))
   }
 
   val fields = document.getElementsByTagName("field")