xref: /aosp_15_r20/external/leakcanary2/shark/src/main/java/shark/internal/InternalSharkCollectionsHelper.kt (revision d9e8da70d8c9df9a41d7848ae506fb3115cae6e6)

<lambda>null1 package shark.internal
2 
3 import shark.HeapObject
4 import shark.HeapObject.HeapClass
5 import shark.HeapObject.HeapInstance
6 import shark.HeapObject.HeapObjectArray
7 import shark.HeapObject.HeapPrimitiveArray
8 
9 /**
10  * INTERNAL
11  *
12  * This class is public to be accessible from other LeakCanary modules but shouldn't be
13  * called directly, the API may break at any point.
14  */
15 object InternalSharkCollectionsHelper {
16 
17   fun arrayListValues(heapInstance: HeapInstance): Sequence<String> {
18     val graph = heapInstance.graph
19     val arrayListReader = OpenJdkInstanceRefReaders.ARRAY_LIST.create(graph)
20       ?: ApacheHarmonyInstanceRefReaders.ARRAY_LIST.create(graph)
21       ?: return emptySequence()
22 
23     if (!arrayListReader.matches(heapInstance)) {
24       return emptySequence()
25     }
26 
27     return arrayListReader.read(heapInstance).map { reference ->
28       val arrayListValue = graph.findObjectById(reference.valueObjectId)
29       val details = reference.lazyDetailsResolver.resolve()
30       "[${details.name}] = ${className(arrayListValue)}"
31     }
32   }
33 
34   private fun className(graphObject: HeapObject): String {
35     return when (graphObject) {
36       is HeapClass -> {
37         graphObject.name
38       }
39       is HeapInstance -> {
40         graphObject.instanceClassName
41       }
42       is HeapObjectArray -> {
43         graphObject.arrayClassName
44       }
45       is HeapPrimitiveArray -> {
46         graphObject.arrayClassName
47       }
48     }
49   }
50 }
51