Merge "Bp2build: handle embedded structs as blueprint"

This commit is contained in:
Liz Kammer
2021-09-15 12:39:29 +00:00
committed by Gerrit Code Review
5 changed files with 77 additions and 2 deletions

View File

@@ -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)

View File

@@ -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",
)`,
},
},

View File

@@ -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
}

View File

@@ -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(),

View File

@@ -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",