diff options
author | 2021-07-14 12:08:25 +0100 | |
---|---|---|
committer | 2021-08-31 17:31:34 +0100 | |
commit | 4e7e20279471bb25ad99bb23e2303c8fb119a094 (patch) | |
tree | edb85d793eff7869efd1fbde6ba683e1051cbad1 /sdk/sdk.go | |
parent | 62782de15c379f0ca018a42b8d9a437215786e73 (diff) |
Separate sdk member type functionality into its own file
Bug: 195754365
Test: m nothing
Change-Id: I63effd8dbcb984d144daf266e53d33a0d07224e4
Diffstat (limited to 'sdk/sdk.go')
-rw-r--r-- | sdk/sdk.go | 143 |
1 files changed, 0 insertions, 143 deletions
diff --git a/sdk/sdk.go b/sdk/sdk.go index c0f614d58..6dea752b3 100644 --- a/sdk/sdk.go +++ b/sdk/sdk.go @@ -17,7 +17,6 @@ package sdk import ( "fmt" "io" - "reflect" "strconv" "github.com/google/blueprint" @@ -95,148 +94,6 @@ type sdkProperties struct { Prebuilt_visibility []string } -// Contains information about the sdk properties that list sdk members by type, e.g. -// Java_header_libs. -type sdkMemberTypeListProperty 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 - - // the dependency tag used for items in this list that can be used to determine the memberType - // for a resolved dependency. - dependencyTag android.SdkMemberTypeDependencyTag -} - -func (p *sdkMemberTypeListProperty) propertyName() string { - return p.memberType.SdkPropertyName() -} - -// Cache of dynamically generated dynamicSdkMemberTypes objects. The key is the pointer -// to a slice of SdkMemberType instances held in android.SdkMemberTypes. -var dynamicSdkMemberTypesMap android.OncePer - -// A dynamically generated set of member list properties and associated structure type. -type dynamicSdkMemberTypes struct { - // The dynamically generated structure type. - // - // Contains one []string exported field for each android.SdkMemberTypes. The name of the field - // is the exported form of the value returned by SdkMemberType.SdkPropertyName(). - propertiesStructType reflect.Type - - // Information about each of the member type specific list properties. - memberTypeListProperties []*sdkMemberTypeListProperty - - memberTypeToProperty map[android.SdkMemberType]*sdkMemberTypeListProperty -} - -func (d *dynamicSdkMemberTypes) createMemberTypeListProperties() interface{} { - return reflect.New(d.propertiesStructType).Interface() -} - -func getDynamicSdkMemberTypes(registry *android.SdkMemberTypesRegistry) *dynamicSdkMemberTypes { - - // Get a key that uniquely identifies the registry contents. - key := registry.UniqueOnceKey() - - // Get the registered types. - registeredTypes := registry.RegisteredTypes() - - // Get the cached value, creating new instance if necessary. - return dynamicSdkMemberTypesMap.Once(key, func() interface{} { - return createDynamicSdkMemberTypes(registeredTypes) - }).(*dynamicSdkMemberTypes) -} - -// Create the dynamicSdkMemberTypes from the list of registered member types. -// -// A struct is created which contains one exported field per member type corresponding to -// the SdkMemberType.SdkPropertyName() value. -// -// A list of sdkMemberListProperty instances is created, one per member type that provides: -// * a reference to the member type. -// * a getter for the corresponding field in the properties struct. -// * a dependency tag that identifies the member type of a resolved dependency. -// -func createDynamicSdkMemberTypes(sdkMemberTypes []android.SdkMemberType) *dynamicSdkMemberTypes { - - var listProperties []*sdkMemberTypeListProperty - memberTypeToProperty := map[android.SdkMemberType]*sdkMemberTypeListProperty{} - var fields []reflect.StructField - - // Iterate over the member types creating StructField and sdkMemberTypeListProperty objects. - nextFieldIndex := 0 - for _, memberType := range sdkMemberTypes { - - p := memberType.SdkPropertyName() - - var getter func(properties interface{}) []string - var setter func(properties interface{}, list []string) - if memberType.RequiresBpProperty() { - // Create a dynamic exported field for the member type's property. - fields = append(fields, reflect.StructField{ - Name: proptools.FieldNameForProperty(p), - Type: reflect.TypeOf([]string{}), - Tag: `android:"arch_variant"`, - }) - - // Copy the field index for use in the getter func as using the loop variable directly will - // cause all funcs to use the last value. - fieldIndex := nextFieldIndex - nextFieldIndex += 1 - - getter = func(properties interface{}) []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).Interface().([]string) - 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)) - } - } - - // Create an sdkMemberTypeListProperty for the member type. - memberListProperty := &sdkMemberTypeListProperty{ - getter: getter, - setter: setter, - memberType: memberType, - - // Dependencies added directly from member properties are always exported. - dependencyTag: android.DependencyTagForSdkMemberType(memberType, true), - } - - memberTypeToProperty[memberType] = memberListProperty - listProperties = append(listProperties, memberListProperty) - } - - // Create a dynamic struct from the collated fields. - propertiesStructType := reflect.StructOf(fields) - - return &dynamicSdkMemberTypes{ - memberTypeListProperties: listProperties, - memberTypeToProperty: memberTypeToProperty, - propertiesStructType: propertiesStructType, - } -} - // sdk defines an SDK which is a logical group of modules (e.g. native libs, headers, java libs, etc.) // which Mainline modules like APEX can choose to build with. func SdkModuleFactory() android.Module { |