diff options
| author | Anton Hansson <hansson@google.com> | 2020-09-25 21:15:45 +0100 |
|---|---|---|
| committer | Anton Hansson <hansson@google.com> | 2020-10-01 18:29:38 +0100 |
| commit | 0347daf68bb712d8bbb8a4e285520b0c245fb39f (patch) | |
| tree | d240dcd32ab42aad5d3f87e75e5cc74f6e580016 | |
| parent | 5d3d620094c59ae11791dfe91109bd80b0e1c463 (diff) | |
| download | platform_tools_metalava-master.tar.gz platform_tools_metalava-master.tar.bz2 platform_tools_metalava-master.zip | |
When erasing generic types, the method must be provided as
context to resolve potential type arguments.
Bug: 169395887
Test: ApiFileTest
Change-Id: I46d757b7885b6b99880416b286b6d04db03fbe84
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") - } } |
