Merge "Bp2build: handle embedded structs as blueprint" am: adfade58a9
am: cfbad2bb31
Original change: https://android-review.googlesource.com/c/platform/build/soong/+/1826433 Change-Id: Iaf63b13709fe06cc437e872d5ab33f9d5fe9d690
This commit is contained in:
@@ -575,6 +575,19 @@ func extractStructProperties(structValue reflect.Value, indent int) map[string]s
|
||||
// Ignore zero-valued fields
|
||||
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)
|
||||
prettyPrintedValue, err := prettyPrint(fieldValue, indent+1)
|
||||
|
@@ -319,6 +319,30 @@ custom {
|
||||
"//build/bazel/platforms/arch:x86": [":dep"],
|
||||
"//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) {
|
||||
continue
|
||||
}
|
||||
|
||||
properties = append(properties, extractPropertyDescriptions(field.Name, field.Type)...)
|
||||
subProps := 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
|
||||
}
|
||||
|
@@ -92,6 +92,7 @@ custom = rule(
|
||||
# bazel_module end
|
||||
"bool_prop": attr.bool(),
|
||||
"bool_ptr_prop": attr.bool(),
|
||||
"embedded_prop": attr.string(),
|
||||
"int64_ptr_prop": attr.int(),
|
||||
# nested_props start
|
||||
# "nested_prop": attr.string(),
|
||||
@@ -99,6 +100,7 @@ custom = rule(
|
||||
# nested_props_ptr start
|
||||
# "nested_prop": attr.string(),
|
||||
# nested_props_ptr end
|
||||
"other_embedded_prop": attr.string(),
|
||||
"string_list_prop": attr.string_list(),
|
||||
"string_prop": attr.string(),
|
||||
"string_ptr_prop": attr.string(),
|
||||
@@ -118,6 +120,7 @@ custom_defaults = rule(
|
||||
"arch_paths_exclude": attr.string_list(),
|
||||
"bool_prop": attr.bool(),
|
||||
"bool_ptr_prop": attr.bool(),
|
||||
"embedded_prop": attr.string(),
|
||||
"int64_ptr_prop": attr.int(),
|
||||
# nested_props start
|
||||
# "nested_prop": attr.string(),
|
||||
@@ -125,6 +128,7 @@ custom_defaults = rule(
|
||||
# nested_props_ptr start
|
||||
# "nested_prop": attr.string(),
|
||||
# nested_props_ptr end
|
||||
"other_embedded_prop": attr.string(),
|
||||
"string_list_prop": attr.string_list(),
|
||||
"string_prop": attr.string(),
|
||||
"string_ptr_prop": attr.string(),
|
||||
@@ -144,6 +148,7 @@ custom_test_ = rule(
|
||||
"arch_paths_exclude": attr.string_list(),
|
||||
"bool_prop": attr.bool(),
|
||||
"bool_ptr_prop": attr.bool(),
|
||||
"embedded_prop": attr.string(),
|
||||
"int64_ptr_prop": attr.int(),
|
||||
# nested_props start
|
||||
# "nested_prop": attr.string(),
|
||||
@@ -151,6 +156,7 @@ custom_test_ = rule(
|
||||
# nested_props_ptr start
|
||||
# "nested_prop": attr.string(),
|
||||
# nested_props_ptr end
|
||||
"other_embedded_prop": attr.string(),
|
||||
"string_list_prop": attr.string_list(),
|
||||
"string_prop": attr.string(),
|
||||
"string_ptr_prop": attr.string(),
|
||||
|
@@ -148,7 +148,18 @@ type nestedProps struct {
|
||||
Nested_prop string
|
||||
}
|
||||
|
||||
type EmbeddedProps struct {
|
||||
Embedded_prop string
|
||||
}
|
||||
|
||||
type OtherEmbeddedProps struct {
|
||||
Other_embedded_prop string
|
||||
}
|
||||
|
||||
type customProps struct {
|
||||
EmbeddedProps
|
||||
*OtherEmbeddedProps
|
||||
|
||||
Bool_prop bool
|
||||
Bool_ptr_prop *bool
|
||||
// Ensure that properties tagged `blueprint:mutated` are omitted
|
||||
@@ -246,7 +257,17 @@ func customDefaultsModuleFactory() android.Module {
|
||||
return m
|
||||
}
|
||||
|
||||
type EmbeddedAttr struct {
|
||||
Embedded_attr string
|
||||
}
|
||||
|
||||
type OtherEmbeddedAttr struct {
|
||||
Other_embedded_attr string
|
||||
}
|
||||
|
||||
type customBazelModuleAttributes struct {
|
||||
EmbeddedAttr
|
||||
*OtherEmbeddedAttr
|
||||
String_prop string
|
||||
String_list_prop []string
|
||||
Arch_paths bazel.LabelListAttribute
|
||||
@@ -275,6 +296,10 @@ func customBp2BuildMutator(ctx android.TopDownMutatorContext) {
|
||||
String_list_prop: m.props.String_list_prop,
|
||||
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{
|
||||
Rule_class: "custom",
|
||||
|
Reference in New Issue
Block a user