diff options
author | Mårten Kongstad <amhk@google.com> | 2024-05-06 14:53:54 +0200 |
---|---|---|
committer | Mårten Kongstad <amhk@google.com> | 2024-05-07 13:16:13 +0200 |
commit | 7c3571fe8b8601003165d608f7f7ceef34ad4fe0 (patch) | |
tree | 17fc0044f6966d1d83784fd82127f21c0437af8f /tools | |
parent | a1fe37137ecff209355df397379b7105f37b6ff5 (diff) | |
download | build-7c3571fe8b8601003165d608f7f7ceef34ad4fe0.tar.gz |
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
Diffstat (limited to 'tools')
-rw-r--r-- | tools/check-flagged-apis/src/com/android/checkflaggedapis/CheckFlaggedApisTest.kt | 14 | ||||
-rw-r--r-- | tools/check-flagged-apis/src/com/android/checkflaggedapis/Main.kt | 25 |
2 files changed, 27 insertions, 12 deletions
diff --git a/tools/check-flagged-apis/src/com/android/checkflaggedapis/CheckFlaggedApisTest.kt b/tools/check-flagged-apis/src/com/android/checkflaggedapis/CheckFlaggedApisTest.kt index 483546151d..29604f4e31 100644 --- a/tools/check-flagged-apis/src/com/android/checkflaggedapis/CheckFlaggedApisTest.kt +++ b/tools/check-flagged-apis/src/com/android/checkflaggedapis/CheckFlaggedApisTest.kt @@ -95,7 +95,7 @@ class CheckFlaggedApisTest { fun testParseApiSignature() { val expected = setOf( - Pair(Symbol.createClass("android/Clazz"), Flag("android.flag.foo")), + Pair(Symbol.createClass("android/Clazz", setOf()), Flag("android.flag.foo")), Pair(Symbol.createMethod("android/Clazz", "Clazz()"), Flag("android.flag.foo")), Pair(Symbol.createField("android/Clazz", "FOO"), Flag("android.flag.foo")), Pair(Symbol.createMethod("android/Clazz", "getErrorCode()"), Flag("android.flag.foo")), @@ -108,7 +108,7 @@ class CheckFlaggedApisTest { Pair( Symbol.createMethod("android/Clazz", "innerClassArg(Landroid/Clazz/Builder;)"), Flag("android.flag.foo")), - Pair(Symbol.createClass("android/Clazz/Builder"), Flag("android.flag.bar")), + Pair(Symbol.createClass("android/Clazz/Builder", setOf()), Flag("android.flag.bar")), ) val actual = parseApiSignature("in-memory", API_SIGNATURE.byteInputStream()) assertEquals(expected, actual) @@ -126,14 +126,14 @@ class CheckFlaggedApisTest { fun testParseApiVersions() { val expected: Set<Symbol> = setOf( - Symbol.createClass("android/Clazz"), + Symbol.createClass("android/Clazz", setOf()), Symbol.createMethod("android/Clazz", "Clazz()"), Symbol.createField("android/Clazz", "FOO"), Symbol.createMethod("android/Clazz", "getErrorCode()"), Symbol.createMethod("android/Clazz", "setData(I[[ILandroid/util/Utility;)"), Symbol.createMethod("android/Clazz", "setVariableData(I[Landroid/util/Atom;)"), Symbol.createMethod("android/Clazz", "innerClassArg(Landroid/Clazz/Builder;)"), - Symbol.createClass("android/Clazz/Builder"), + Symbol.createClass("android/Clazz/Builder", setOf()), ) val actual = parseApiVersions(API_VERSIONS.byteInputStream()) assertEquals(expected, actual) @@ -153,7 +153,7 @@ class CheckFlaggedApisTest { .trim() val expected: Set<Symbol> = setOf( - Symbol.createClass("android/Clazz/Foo/Bar"), + Symbol.createClass("android/Clazz/Foo/Bar", setOf()), Symbol.createMethod("android/Clazz/Foo/Bar", "Bar()"), ) val actual = parseApiVersions(apiVersions.byteInputStream()) @@ -176,7 +176,7 @@ class CheckFlaggedApisTest { val expected = setOf<ApiError>( DisabledFlaggedApiIsPresentError( - Symbol.createClass("android/Clazz"), Flag("android.flag.foo")), + Symbol.createClass("android/Clazz", setOf()), Flag("android.flag.foo")), DisabledFlaggedApiIsPresentError( Symbol.createMethod("android/Clazz", "Clazz()"), Flag("android.flag.foo")), DisabledFlaggedApiIsPresentError( @@ -193,7 +193,7 @@ class CheckFlaggedApisTest { Symbol.createMethod("android/Clazz", "innerClassArg(Landroid/Clazz/Builder;)"), Flag("android.flag.foo")), DisabledFlaggedApiIsPresentError( - Symbol.createClass("android/Clazz/Builder"), Flag("android.flag.bar")), + Symbol.createClass("android/Clazz/Builder", setOf()), Flag("android.flag.bar")), ) val actual = findErrors( 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 4ff9880a59..0f58aa54b9 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 @@ internal sealed class Symbol { 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 @@ internal sealed class Symbol { 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 @@ internal fun parseApiSignature(path: String, input: InputStream): Set<Pair<Symbo 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 @@ internal fun parseApiVersions(input: InputStream): Set<Symbol> { 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") |