summaryrefslogtreecommitdiff
path: root/sdk/update.go
diff options
context:
space:
mode:
Diffstat (limited to 'sdk/update.go')
-rw-r--r--sdk/update.go59
1 files changed, 46 insertions, 13 deletions
diff --git a/sdk/update.go b/sdk/update.go
index 7d6780a18..e2e59979e 100644
--- a/sdk/update.go
+++ b/sdk/update.go
@@ -824,32 +824,65 @@ func outputUnnamedValue(contents *generatedContents, value reflect.Value) {
case reflect.String:
contents.UnindentedPrintf("%q", value)
+ case reflect.Ptr:
+ outputUnnamedValue(contents, value.Elem())
+
case reflect.Slice:
length := value.Len()
if length == 0 {
contents.UnindentedPrintf("[]")
- } else if length == 1 {
- contents.UnindentedPrintf("[")
- outputUnnamedValue(contents, value.Index(0))
- contents.UnindentedPrintf("]")
} else {
- contents.UnindentedPrintf("[\n")
- contents.Indent()
- for i := 0; i < length; i++ {
- itemValue := value.Index(i)
- contents.IndentedPrintf("")
- outputUnnamedValue(contents, itemValue)
- contents.UnindentedPrintf(",\n")
+ firstValue := value.Index(0)
+ if length == 1 && !multiLineValue(firstValue) {
+ contents.UnindentedPrintf("[")
+ outputUnnamedValue(contents, firstValue)
+ contents.UnindentedPrintf("]")
+ } else {
+ contents.UnindentedPrintf("[\n")
+ contents.Indent()
+ for i := 0; i < length; i++ {
+ itemValue := value.Index(i)
+ contents.IndentedPrintf("")
+ outputUnnamedValue(contents, itemValue)
+ contents.UnindentedPrintf(",\n")
+ }
+ contents.Dedent()
+ contents.IndentedPrintf("]")
+ }
+ }
+
+ case reflect.Struct:
+ // Avoid unlimited recursion by requiring every structure to implement android.BpPrintable.
+ v := value.Interface()
+ if _, ok := v.(android.BpPrintable); !ok {
+ panic(fmt.Errorf("property value %#v of type %T does not implement android.BpPrintable", v, v))
+ }
+ contents.UnindentedPrintf("{\n")
+ contents.Indent()
+ for f := 0; f < valueType.NumField(); f++ {
+ fieldType := valueType.Field(f)
+ if fieldType.Anonymous {
+ continue
}
- contents.Dedent()
- contents.IndentedPrintf("]")
+ fieldValue := value.Field(f)
+ fieldName := fieldType.Name
+ propertyName := proptools.PropertyNameForField(fieldName)
+ outputNamedValue(contents, propertyName, fieldValue)
}
+ contents.Dedent()
+ contents.IndentedPrintf("}")
default:
panic(fmt.Errorf("Unknown type: %T of value %#v", value, value))
}
}
+// multiLineValue returns true if the supplied value may require multiple lines in the output.
+func multiLineValue(value reflect.Value) bool {
+ kind := value.Kind()
+ return kind == reflect.Slice || kind == reflect.Struct
+}
+
func (s *sdk) GetAndroidBpContentsForTests() string {
contents := &generatedContents{}
generateBpContents(contents, s.builderForTests.bpFile)