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:
Liz Kammer
2021-09-15 13:05:54 +00:00
committed by Automerger Merge Worker
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 // 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)

View File

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

View File

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

View File

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

View File

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