Add maps to soong-debug-info.json

Test: m nothing
Change-Id: Iffa308e1b93a5f7e1cea7587bef3540d1eb37de5
This commit is contained in:
Joe Onorato 2024-02-18 14:47:44 -08:00
parent c7ec117556
commit 5920e5507e

View file

@ -4975,20 +4975,41 @@ type Debuggable interface {
} }
// Convert a slice in a reflect.Value to a value suitable for outputting to json // Convert a slice in a reflect.Value to a value suitable for outputting to json
func debugPropertySlice(value reflect.Value) interface{} { func debugSlice(value reflect.Value) interface{} {
size := value.Len() size := value.Len()
if size == 0 { if size == 0 {
return nil return nil
} }
result := make([]interface{}, size) result := make([]interface{}, size)
for i := 0; i < size; i++ { for i := 0; i < size; i++ {
result[i] = debugPropertyValue(value.Index(i)) result[i] = debugValue(value.Index(i))
} }
return result return result
} }
// Convert a map in a reflect.Value to a value suitable for outputting to json
func debugMap(value reflect.Value) interface{} {
if value.IsNil() {
return nil
}
result := make(map[string]interface{})
iter := value.MapRange()
for iter.Next() {
// In the (hopefully) rare case of a key collision (which will happen when multiple
// go-typed keys have the same string representation, we'll just overwrite the last
// value.
result[debugKey(iter.Key())] = debugValue(iter.Value())
}
return result
}
// Convert a value into a string, suitable for being a json map key.
func debugKey(value reflect.Value) string {
return fmt.Sprintf("%v", value)
}
// Convert a single value (possibly a map or slice too) in a reflect.Value to a value suitable for outputting to json // Convert a single value (possibly a map or slice too) in a reflect.Value to a value suitable for outputting to json
func debugPropertyValue(value reflect.Value) interface{} { func debugValue(value reflect.Value) interface{} {
// Dereference pointers down to the real type // Dereference pointers down to the real type
for value.Kind() == reflect.Ptr { for value.Kind() == reflect.Ptr {
// If it's nil, return nil // If it's nil, return nil
@ -5007,9 +5028,11 @@ func debugPropertyValue(value reflect.Value) interface{} {
case reflect.Bool, reflect.String, reflect.Int, reflect.Uint: case reflect.Bool, reflect.String, reflect.Int, reflect.Uint:
return value.Interface() return value.Interface()
case reflect.Slice: case reflect.Slice:
return debugPropertySlice(value) return debugSlice(value)
case reflect.Struct: case reflect.Struct:
return debugPropertyMap(value) return debugStruct(value)
case reflect.Map:
return debugMap(value)
case reflect.Interface: case reflect.Interface:
// ??? // ???
default: default:
@ -5020,9 +5043,9 @@ func debugPropertyValue(value reflect.Value) interface{} {
} }
// Convert an object in a reflect.Value to a value suitable for outputting to json // Convert an object in a reflect.Value to a value suitable for outputting to json
func debugPropertyMap(value reflect.Value) interface{} { func debugStruct(value reflect.Value) interface{} {
result := make(map[string]interface{}) result := make(map[string]interface{})
debugPropertyMapAppend(value, &result) debugStructAppend(value, &result)
if len(result) == 0 { if len(result) == 0 {
return nil return nil
} }
@ -5030,7 +5053,7 @@ func debugPropertyMap(value reflect.Value) interface{} {
} }
// Convert an object to a value suiable for outputting to json // Convert an object to a value suiable for outputting to json
func debugPropertyMapAppend(value reflect.Value, result *map[string]interface{}) { func debugStructAppend(value reflect.Value, result *map[string]interface{}) {
for value.Kind() == reflect.Ptr { for value.Kind() == reflect.Ptr {
if value.IsNil() { if value.IsNil() {
return return
@ -5048,7 +5071,7 @@ func debugPropertyMapAppend(value reflect.Value, result *map[string]interface{})
structType := value.Type() structType := value.Type()
for i := 0; i < value.NumField(); i++ { for i := 0; i < value.NumField(); i++ {
v := debugPropertyValue(value.Field(i)) v := debugValue(value.Field(i))
if v != nil { if v != nil {
(*result)[structType.Field(i).Name] = v (*result)[structType.Field(i).Name] = v
} }
@ -5059,7 +5082,7 @@ func debugPropertyStruct(props interface{}, result *map[string]interface{}) {
if props == nil { if props == nil {
return return
} }
debugPropertyMapAppend(reflect.ValueOf(props), result) debugStructAppend(reflect.ValueOf(props), result)
} }
// Get the debug json for a single module. Returns thae data as // Get the debug json for a single module. Returns thae data as
@ -5091,7 +5114,7 @@ func getModuleDebugJson(module *moduleInfo) []byte {
t := reflect.TypeOf(dep.tag) t := reflect.TypeOf(dep.tag)
if t != nil { if t != nil {
result[i].TagType = t.PkgPath() + "." + t.Name() result[i].TagType = t.PkgPath() + "." + t.Name()
result[i].TagData = debugPropertyMap(reflect.ValueOf(dep.tag)) result[i].TagData = debugStruct(reflect.ValueOf(dep.tag))
} }
} }
return result return result
@ -5115,10 +5138,8 @@ func getModuleDebugJson(module *moduleInfo) []byte {
} }
} }
fields := make(map[string]interface{}) if p != nil {
debugPropertyStruct(p, &fields) pj.Fields = debugValue(reflect.ValueOf(p))
if len(fields) > 0 {
pj.Fields = fields
include = true include = true
} }