diff options
author | 2021-04-24 00:47:29 +0100 | |
---|---|---|
committer | 2021-04-24 22:33:04 +0100 | |
commit | cd06467124e24b80299a09a7b2ff7a7e149b23c3 (patch) | |
tree | 0d7cff5bca0f33307eb82c57e821773cbb75c744 /sdk/sdk.go | |
parent | a720811c3813afb192ed69be0c38fac837514698 (diff) |
Generate snapshot member list properties from dependencies
Previously, the snapshot member list properties were simply copied from
the sdk variants. That worked because the snapshot member list
properties must include all exported (i.e. visible outside the sdk
snaphot) members and only members explicitly specified in the sdk
member list properties were exported. However, a preceding change
allowed members that were transitively added (and so not explicitly
specified on the sdk) to be exported.
This change ensures that those exported members are added to the
snapshot member properties which means that they will now work properly
with the sdk version mutators.
This does not add tests for this because no existing SdkMemberType
exports its transitive dependencies and there is currently no way to
register an SdkMemberType for testing only. A following change will
exercise this functionality.
Bug: 186290299
Test: m nothing
Change-Id: Iadbdd86f6dcdd183fa99f647222a43d412271501
Diffstat (limited to 'sdk/sdk.go')
-rw-r--r-- | sdk/sdk.go | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/sdk/sdk.go b/sdk/sdk.go index 1c6002a31..95a49306d 100644 --- a/sdk/sdk.go +++ b/sdk/sdk.go @@ -101,6 +101,9 @@ type sdkMemberListProperty struct { // getter for the list of member names getter func(properties interface{}) []string + // setter for the list of member names + setter func(properties interface{}, list []string) + // the type of member referenced in the list memberType android.SdkMemberType @@ -127,6 +130,8 @@ type dynamicSdkMemberTypes struct { // Information about each of the member type specific list properties. memberListProperties []*sdkMemberListProperty + + memberTypeToProperty map[android.SdkMemberType]*sdkMemberListProperty } func (d *dynamicSdkMemberTypes) createMemberListProperties() interface{} { @@ -160,6 +165,7 @@ func getDynamicSdkMemberTypes(registry *android.SdkMemberTypesRegistry) *dynamic func createDynamicSdkMemberTypes(sdkMemberTypes []android.SdkMemberType) *dynamicSdkMemberTypes { var listProperties []*sdkMemberListProperty + memberTypeToProperty := map[android.SdkMemberType]*sdkMemberListProperty{} var fields []reflect.StructField // Iterate over the member types creating StructField and sdkMemberListProperty objects. @@ -191,12 +197,24 @@ func createDynamicSdkMemberTypes(sdkMemberTypes []android.SdkMemberType) *dynami return list }, + setter: func(properties interface{}, list []string) { + // The properties is expected to be of the following form (where + // <Module_types> is the name of an SdkMemberType.SdkPropertyName(). + // properties *struct {<Module_types> []string, ....} + // + // Although it accesses the field by index the following reflection code is equivalent to: + // *properties.<Module_types> = list + // + reflect.ValueOf(properties).Elem().Field(fieldIndex).Set(reflect.ValueOf(list)) + }, + memberType: memberType, // Dependencies added directly from member properties are always exported. dependencyTag: android.DependencyTagForSdkMemberType(memberType, true), } + memberTypeToProperty[memberType] = memberListProperty listProperties = append(listProperties, memberListProperty) } @@ -205,6 +223,7 @@ func createDynamicSdkMemberTypes(sdkMemberTypes []android.SdkMemberType) *dynami return &dynamicSdkMemberTypes{ memberListProperties: listProperties, + memberTypeToProperty: memberTypeToProperty, propertiesStructType: propertiesStructType, } } @@ -256,6 +275,10 @@ func (s *sdk) memberListProperties() []*sdkMemberListProperty { return s.dynamicSdkMemberTypes.memberListProperties } +func (s *sdk) memberListProperty(memberType android.SdkMemberType) *sdkMemberListProperty { + return s.dynamicSdkMemberTypes.memberTypeToProperty[memberType] +} + func (s *sdk) snapshot() bool { return s.properties.Snapshot } |