Merge "Bp2build: handle embedded structs as blueprint" am: adfade58a9
am: cfbad2bb31
am: a31ff68c4a
Original change: https://android-review.googlesource.com/c/platform/build/soong/+/1826433 Change-Id: I605d2394a66501fa19a6544d6f36323a07c3c8db
This commit is contained in:
@@ -575,6 +575,19 @@ func extractStructProperties(structValue reflect.Value, indent int) map[string]s
|
|||||||
// Ignore zero-valued fields
|
// Ignore zero-valued fields
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
// if the struct is embedded (anonymous), flatten the properties into the containing struct
|
||||||
|
if field.Anonymous {
|
||||||
|
if field.Type.Kind() == reflect.Ptr {
|
||||||
|
fieldValue = fieldValue.Elem()
|
||||||
|
}
|
||||||
|
if fieldValue.Type().Kind() == reflect.Struct {
|
||||||
|
propsToMerge := extractStructProperties(fieldValue, indent)
|
||||||
|
for prop, value := range propsToMerge {
|
||||||
|
ret[prop] = value
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
propertyName := proptools.PropertyNameForField(field.Name)
|
propertyName := proptools.PropertyNameForField(field.Name)
|
||||||
prettyPrintedValue, err := prettyPrint(fieldValue, indent+1)
|
prettyPrintedValue, err := prettyPrint(fieldValue, indent+1)
|
||||||
|
@@ -319,6 +319,30 @@ custom {
|
|||||||
"//build/bazel/platforms/arch:x86": [":dep"],
|
"//build/bazel/platforms/arch:x86": [":dep"],
|
||||||
"//conditions:default": [],
|
"//conditions:default": [],
|
||||||
}),
|
}),
|
||||||
|
)`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
blueprint: `custom {
|
||||||
|
name: "embedded_props",
|
||||||
|
embedded_prop: "abc",
|
||||||
|
bazel_module: { bp2build_available: true },
|
||||||
|
}`,
|
||||||
|
expectedBazelTargets: []string{`custom(
|
||||||
|
name = "embedded_props",
|
||||||
|
embedded_attr = "abc",
|
||||||
|
)`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
blueprint: `custom {
|
||||||
|
name: "ptr_to_embedded_props",
|
||||||
|
other_embedded_prop: "abc",
|
||||||
|
bazel_module: { bp2build_available: true },
|
||||||
|
}`,
|
||||||
|
expectedBazelTargets: []string{`custom(
|
||||||
|
name = "ptr_to_embedded_props",
|
||||||
|
other_embedded_attr = "abc",
|
||||||
)`,
|
)`,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@@ -160,8 +160,15 @@ func extractPropertyDescriptionsFromStruct(structType reflect.Type) []property {
|
|||||||
if shouldSkipStructField(field) {
|
if shouldSkipStructField(field) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
subProps := extractPropertyDescriptions(field.Name, field.Type)
|
||||||
properties = append(properties, extractPropertyDescriptions(field.Name, field.Type)...)
|
// if the struct is embedded (anonymous), flatten the properties into the containing struct
|
||||||
|
if field.Anonymous {
|
||||||
|
for _, prop := range subProps {
|
||||||
|
properties = append(properties, prop.properties...)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
properties = append(properties, subProps...)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return properties
|
return properties
|
||||||
}
|
}
|
||||||
|
@@ -92,6 +92,7 @@ custom = rule(
|
|||||||
# bazel_module end
|
# bazel_module end
|
||||||
"bool_prop": attr.bool(),
|
"bool_prop": attr.bool(),
|
||||||
"bool_ptr_prop": attr.bool(),
|
"bool_ptr_prop": attr.bool(),
|
||||||
|
"embedded_prop": attr.string(),
|
||||||
"int64_ptr_prop": attr.int(),
|
"int64_ptr_prop": attr.int(),
|
||||||
# nested_props start
|
# nested_props start
|
||||||
# "nested_prop": attr.string(),
|
# "nested_prop": attr.string(),
|
||||||
@@ -99,6 +100,7 @@ custom = rule(
|
|||||||
# nested_props_ptr start
|
# nested_props_ptr start
|
||||||
# "nested_prop": attr.string(),
|
# "nested_prop": attr.string(),
|
||||||
# nested_props_ptr end
|
# nested_props_ptr end
|
||||||
|
"other_embedded_prop": attr.string(),
|
||||||
"string_list_prop": attr.string_list(),
|
"string_list_prop": attr.string_list(),
|
||||||
"string_prop": attr.string(),
|
"string_prop": attr.string(),
|
||||||
"string_ptr_prop": attr.string(),
|
"string_ptr_prop": attr.string(),
|
||||||
@@ -118,6 +120,7 @@ custom_defaults = rule(
|
|||||||
"arch_paths_exclude": attr.string_list(),
|
"arch_paths_exclude": attr.string_list(),
|
||||||
"bool_prop": attr.bool(),
|
"bool_prop": attr.bool(),
|
||||||
"bool_ptr_prop": attr.bool(),
|
"bool_ptr_prop": attr.bool(),
|
||||||
|
"embedded_prop": attr.string(),
|
||||||
"int64_ptr_prop": attr.int(),
|
"int64_ptr_prop": attr.int(),
|
||||||
# nested_props start
|
# nested_props start
|
||||||
# "nested_prop": attr.string(),
|
# "nested_prop": attr.string(),
|
||||||
@@ -125,6 +128,7 @@ custom_defaults = rule(
|
|||||||
# nested_props_ptr start
|
# nested_props_ptr start
|
||||||
# "nested_prop": attr.string(),
|
# "nested_prop": attr.string(),
|
||||||
# nested_props_ptr end
|
# nested_props_ptr end
|
||||||
|
"other_embedded_prop": attr.string(),
|
||||||
"string_list_prop": attr.string_list(),
|
"string_list_prop": attr.string_list(),
|
||||||
"string_prop": attr.string(),
|
"string_prop": attr.string(),
|
||||||
"string_ptr_prop": attr.string(),
|
"string_ptr_prop": attr.string(),
|
||||||
@@ -144,6 +148,7 @@ custom_test_ = rule(
|
|||||||
"arch_paths_exclude": attr.string_list(),
|
"arch_paths_exclude": attr.string_list(),
|
||||||
"bool_prop": attr.bool(),
|
"bool_prop": attr.bool(),
|
||||||
"bool_ptr_prop": attr.bool(),
|
"bool_ptr_prop": attr.bool(),
|
||||||
|
"embedded_prop": attr.string(),
|
||||||
"int64_ptr_prop": attr.int(),
|
"int64_ptr_prop": attr.int(),
|
||||||
# nested_props start
|
# nested_props start
|
||||||
# "nested_prop": attr.string(),
|
# "nested_prop": attr.string(),
|
||||||
@@ -151,6 +156,7 @@ custom_test_ = rule(
|
|||||||
# nested_props_ptr start
|
# nested_props_ptr start
|
||||||
# "nested_prop": attr.string(),
|
# "nested_prop": attr.string(),
|
||||||
# nested_props_ptr end
|
# nested_props_ptr end
|
||||||
|
"other_embedded_prop": attr.string(),
|
||||||
"string_list_prop": attr.string_list(),
|
"string_list_prop": attr.string_list(),
|
||||||
"string_prop": attr.string(),
|
"string_prop": attr.string(),
|
||||||
"string_ptr_prop": attr.string(),
|
"string_ptr_prop": attr.string(),
|
||||||
|
@@ -148,7 +148,18 @@ type nestedProps struct {
|
|||||||
Nested_prop string
|
Nested_prop string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type EmbeddedProps struct {
|
||||||
|
Embedded_prop string
|
||||||
|
}
|
||||||
|
|
||||||
|
type OtherEmbeddedProps struct {
|
||||||
|
Other_embedded_prop string
|
||||||
|
}
|
||||||
|
|
||||||
type customProps struct {
|
type customProps struct {
|
||||||
|
EmbeddedProps
|
||||||
|
*OtherEmbeddedProps
|
||||||
|
|
||||||
Bool_prop bool
|
Bool_prop bool
|
||||||
Bool_ptr_prop *bool
|
Bool_ptr_prop *bool
|
||||||
// Ensure that properties tagged `blueprint:mutated` are omitted
|
// Ensure that properties tagged `blueprint:mutated` are omitted
|
||||||
@@ -246,7 +257,17 @@ func customDefaultsModuleFactory() android.Module {
|
|||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type EmbeddedAttr struct {
|
||||||
|
Embedded_attr string
|
||||||
|
}
|
||||||
|
|
||||||
|
type OtherEmbeddedAttr struct {
|
||||||
|
Other_embedded_attr string
|
||||||
|
}
|
||||||
|
|
||||||
type customBazelModuleAttributes struct {
|
type customBazelModuleAttributes struct {
|
||||||
|
EmbeddedAttr
|
||||||
|
*OtherEmbeddedAttr
|
||||||
String_prop string
|
String_prop string
|
||||||
String_list_prop []string
|
String_list_prop []string
|
||||||
Arch_paths bazel.LabelListAttribute
|
Arch_paths bazel.LabelListAttribute
|
||||||
@@ -275,6 +296,10 @@ func customBp2BuildMutator(ctx android.TopDownMutatorContext) {
|
|||||||
String_list_prop: m.props.String_list_prop,
|
String_list_prop: m.props.String_list_prop,
|
||||||
Arch_paths: paths,
|
Arch_paths: paths,
|
||||||
}
|
}
|
||||||
|
attrs.Embedded_attr = m.props.Embedded_prop
|
||||||
|
if m.props.OtherEmbeddedProps != nil {
|
||||||
|
attrs.OtherEmbeddedAttr = &OtherEmbeddedAttr{Other_embedded_attr: m.props.OtherEmbeddedProps.Other_embedded_prop}
|
||||||
|
}
|
||||||
|
|
||||||
props := bazel.BazelTargetModuleProperties{
|
props := bazel.BazelTargetModuleProperties{
|
||||||
Rule_class: "custom",
|
Rule_class: "custom",
|
||||||
|
Reference in New Issue
Block a user