aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Hansson <hansson@google.com>2020-09-25 21:15:45 +0100
committerAnton Hansson <hansson@google.com>2020-10-01 18:29:38 +0100
commit0347daf68bb712d8bbb8a4e285520b0c245fb39f (patch)
treed240dcd32ab42aad5d3f87e75e5cc74f6e580016
parent5d3d620094c59ae11791dfe91109bd80b0e1c463 (diff)
downloadplatform_tools_metalava-master.tar.gz
platform_tools_metalava-master.tar.bz2
platform_tools_metalava-master.zip
Fix DexApiWriter inaccuracies on TextCodeBaseHEADmaster
When erasing generic types, the method must be provided as context to resolve potential type arguments. Bug: 169395887 Test: ApiFileTest Change-Id: I46d757b7885b6b99880416b286b6d04db03fbe84
-rw-r--r--src/main/java/com/android/tools/metalava/DexApiWriter.kt8
-rw-r--r--src/main/java/com/android/tools/metalava/model/TypeItem.kt10
-rw-r--r--src/main/java/com/android/tools/metalava/model/psi/PsiTypeItem.kt2
-rw-r--r--src/test/java/com/android/tools/metalava/ApiFileTest.kt21
-rw-r--r--src/test/java/com/android/tools/metalava/model/text/TextTypeItemTest.kt16
5 files changed, 33 insertions, 24 deletions
diff --git a/src/main/java/com/android/tools/metalava/DexApiWriter.kt b/src/main/java/com/android/tools/metalava/DexApiWriter.kt
index fc20f6bb..1142b2e9 100644
--- a/src/main/java/com/android/tools/metalava/DexApiWriter.kt
+++ b/src/main/java/com/android/tools/metalava/DexApiWriter.kt
@@ -52,14 +52,14 @@ class DexApiWriter(
writer.print(method.internalName())
writer.print("(")
for (pi in method.parameters()) {
- writer.print(pi.type().internalName())
+ writer.print(pi.type().internalName(method))
}
writer.print(")")
if (method.isConstructor()) {
writer.print("V")
} else {
val returnType = method.returnType()
- writer.print(returnType?.internalName() ?: "V")
+ writer.print(returnType?.internalName(method) ?: "V")
}
writer.print("\n")
}
@@ -71,7 +71,7 @@ class DexApiWriter(
writer.print("->")
writer.print(field.name())
writer.print(":")
- writer.print(field.type().internalName())
+ writer.print(field.type().internalName(field))
writer.print("\n")
}
-} \ No newline at end of file
+}
diff --git a/src/main/java/com/android/tools/metalava/model/TypeItem.kt b/src/main/java/com/android/tools/metalava/model/TypeItem.kt
index 06ae906a..1687d079 100644
--- a/src/main/java/com/android/tools/metalava/model/TypeItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/TypeItem.kt
@@ -60,10 +60,14 @@ interface TypeItem {
/** Alias for [toTypeString] with erased=true */
fun toErasedTypeString(context: Item? = null): String
- /** Returns the internal name of the type, as seen in bytecode */
- fun internalName(): String {
+ /**
+ * Returns the internal name of the type, as seen in bytecode. The optional [context]
+ * provides the method or class where this type appears, and can be used for example
+ * to resolve the bounds for a type variable used in a method that was specified on the class.
+ */
+ fun internalName(context: Item? = null): String {
// Default implementation; PSI subclass is more accurate
- return toSlashFormat(toErasedTypeString())
+ return toSlashFormat(toErasedTypeString(context))
}
/** Array dimensions of this type; for example, for String it's 0 and for String[][] it's 2. */
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiTypeItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiTypeItem.kt
index 5dc96a24..bfe85114 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiTypeItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiTypeItem.kt
@@ -189,7 +189,7 @@ class PsiTypeItem private constructor(
return psiType.arrayDimensions
}
- override fun internalName(): String {
+ override fun internalName(context: Item?): String {
if (primitive) {
val signature = getPrimitiveSignature(toString())
if (signature != null) {
diff --git a/src/test/java/com/android/tools/metalava/ApiFileTest.kt b/src/test/java/com/android/tools/metalava/ApiFileTest.kt
index c13a6b02..3a789286 100644
--- a/src/test/java/com/android/tools/metalava/ApiFileTest.kt
+++ b/src/test/java/com/android/tools/metalava/ApiFileTest.kt
@@ -4466,4 +4466,25 @@ class ApiFileTest : DriverTest() {
includeSignatureVersion = true
)
}
+
+ @Test
+ fun `Test type erasure and dexApi from signature`() {
+ check(
+ signatureSources = arrayOf("""
+ package android.widget {
+
+ @android.widget.RemoteViews.RemoteView public class ListView extends android.widget.AbsListView {
+ method protected <T extends android.view.View> T findViewTraversal(@IdRes int);
+ method protected long tryAcquireShared(long);
+ }
+
+ }
+"""),
+ dexApi = """
+ Landroid/widget/ListView;
+ Landroid/widget/ListView;->findViewTraversal(I)Landroid/view/View;
+ Landroid/widget/ListView;->tryAcquireShared(J)J
+ """
+ )
+ }
}
diff --git a/src/test/java/com/android/tools/metalava/model/text/TextTypeItemTest.kt b/src/test/java/com/android/tools/metalava/model/text/TextTypeItemTest.kt
index 36a156a2..10ce148e 100644
--- a/src/test/java/com/android/tools/metalava/model/text/TextTypeItemTest.kt
+++ b/src/test/java/com/android/tools/metalava/model/text/TextTypeItemTest.kt
@@ -182,20 +182,4 @@ class TextTypeItemTest {
assertThat(TextTypeItem.stripKotlinNullChars("Map<? extends K, ? extends V>")).isEqualTo("Map<? extends K, ? extends V>")
assertThat(TextTypeItem.stripKotlinNullChars("Map<?extends K,?extends V>")).isEqualTo("Map<?extends K,?extends V>")
}
-
- @Test
- fun `long internal JVM type`() {
- val codebase = ApiFile.parseApi(
- "test", """
- package test.pkg {
- public final class TestClass {
- method public long build();
- }
- }
- """.trimIndent(), false
- )
- val cls = codebase.findClass("test.pkg.TestClass")
- val method = cls?.findMethod("build", "") as TextMethodItem
- assertThat(method.returnType()?.internalName()).isEqualTo("J")
- }
}