Output properties before sets in snapshot module

This ensures a consistent output irrespective of whether property sets
are created before or after the properties are added. This provides a
little more flexibility in the creation code which allows that to be
simplfied.

Also switches from using reflection to a type switch.

Bug: 142918168
Test: m nothing
Change-Id: Ia025bfc751f1217d1658de6fb8e15091ea0ea9ff
This commit is contained in:
Paul Duffin 2020-03-11 18:17:42 +00:00
parent 0174d8d2c9
commit 07ef3cb1fd
3 changed files with 29 additions and 17 deletions

View file

@ -1212,12 +1212,12 @@ module_exports_snapshot {
name: "myexports@current",
device_supported: false,
host_supported: true,
native_static_libs: ["myexports_mynativelib@current"],
target: {
host: {
compile_multilib: "64",
},
},
native_static_libs: ["myexports_mynativelib@current"],
}`),
checkAllCopyRules(`
include/Test.h -> include/include/Test.h

View file

@ -920,6 +920,7 @@ java_import {
module_exports_snapshot {
name: "myexports@current",
host_supported: true,
java_libs: ["myexports_myjavalib@current"],
target: {
android: {
java_header_libs: ["myexports_androidjavalib@current"],
@ -928,7 +929,6 @@ module_exports_snapshot {
java_header_libs: ["myexports_hostjavalib@current"],
},
},
java_libs: ["myexports_myjavalib@current"],
}
`),
checkAllCopyRules(`

View file

@ -515,41 +515,53 @@ func generateBpContents(contents *generatedContents, bpFile *bpFile) {
func outputPropertySet(contents *generatedContents, set *bpPropertySet) {
contents.Indent()
// Output the properties first, followed by the nested sets. This ensures a
// consistent output irrespective of whether property sets are created before
// or after the properties. This simplifies the creation of the module.
for _, name := range set.order {
value := set.getValue(name)
reflectedValue := reflect.ValueOf(value)
t := reflectedValue.Type()
kind := t.Kind()
switch kind {
case reflect.Slice:
length := reflectedValue.Len()
switch v := value.(type) {
case []string:
length := len(v)
if length > 1 {
contents.Printfln("%s: [", name)
contents.Indent()
for i := 0; i < length; i = i + 1 {
contents.Printfln("%q,", reflectedValue.Index(i).Interface())
contents.Printfln("%q,", v[i])
}
contents.Dedent()
contents.Printfln("],")
} else if length == 0 {
contents.Printfln("%s: [],", name)
} else {
contents.Printfln("%s: [%q],", name, reflectedValue.Index(0).Interface())
contents.Printfln("%s: [%q],", name, v[0])
}
case reflect.Bool:
contents.Printfln("%s: %t,", name, reflectedValue.Bool())
case reflect.Ptr:
contents.Printfln("%s: {", name)
outputPropertySet(contents, reflectedValue.Interface().(*bpPropertySet))
contents.Printfln("},")
case bool:
contents.Printfln("%s: %t,", name, v)
case *bpPropertySet:
// Do not write property sets in the properties phase.
default:
contents.Printfln("%s: %q,", name, value)
}
}
for _, name := range set.order {
value := set.getValue(name)
// Only write property sets in the sets phase.
switch v := value.(type) {
case *bpPropertySet:
contents.Printfln("%s: {", name)
outputPropertySet(contents, v)
contents.Printfln("},")
}
}
contents.Dedent()
}