Refactor visibility to support visibility on defaults modules
Existing modules, either general one or package ones have a single visibility property, called visibility in general, and default_visibility on package, that controls access to that module, or in the case of package sets the default visibility of all modules in that package. The property is checked and gathered during the similarly named phases of visibility processing. The defaults module will be different as it will have two properties. The first, visibility, will not affect the visibility of the module, it only affects the visibility of modules that 'extend' the defaults. So, it will need checking but not parsing. The second property, defaults_visibility, will affect the visibility of the module and so will need both checking and parsing. The current implementation does not handle those cases because: 1) It does not differentiate between the property that affects the module and those that do not. It checks and gathers all of them with the last property gathered overriding the rules for the previous properties. 2) It relies on overriding methods in MethodBase in order to change the default behavior for the package module. That works because packageModule embeds ModuleBase but will not work for DefaultsModuleBase as it does not embed ModuleBase and instead is embedded alongside it so attempting to override a method in MethodBase leads to ambiguity. This change addresses the issues as follows: 1) It adds a new visibility() []string method to get access to the primary visibility rules, i.e. the ones that affect the module. 2) It adds two fields, 'visibilityPropertyInfo []visibilityProperty' to provide information about all the properties that need checking, and 'primaryVisibilityProperty visibilityProperty' to specify the property that affects the module. The PackageFactory() and InitAndroidModule(Module) functions are modified to initialize the fields. The override of the visibilityProperties() method for packageModule is removed and the default implementations of visibilityProperties() and visibility() on ModuleBase return information from the two new fields. The InitDefaultsModule is updated to also initialize the two new fields. It uses nil for primaryVisibilityProperty for now but that will be changed to return defaults_visibility. It also uses the commonProperties structure created for the defaults directly instead of having to search for it through properties(). Changed the visibilityProperty to take a pointer to the property that can be used to retrieve the value rather than a lambda function. Bug: 130796911 Test: m nothing Change-Id: Icadd470a5f692a48ec61de02bf3dfde3e2eea2ef
This commit is contained in:
@@ -211,6 +211,9 @@ type Module interface {
|
||||
|
||||
// Get information about the properties that can contain visibility rules.
|
||||
visibilityProperties() []visibilityProperty
|
||||
|
||||
// Get the visibility rules that control the visibility of this module.
|
||||
visibility() []string
|
||||
}
|
||||
|
||||
// Qualified id for a module
|
||||
@@ -503,6 +506,12 @@ func InitAndroidModule(m Module) {
|
||||
&base.variableProperties)
|
||||
base.generalProperties = m.GetProperties()
|
||||
base.customizableProperties = m.GetProperties()
|
||||
|
||||
// The default_visibility property needs to be checked and parsed by the visibility module during
|
||||
// its checking and parsing phases.
|
||||
base.primaryVisibilityProperty =
|
||||
newVisibilityProperty("visibility", &base.commonProperties.Visibility)
|
||||
base.visibilityPropertyInfo = []visibilityProperty{base.primaryVisibilityProperty}
|
||||
}
|
||||
|
||||
func InitAndroidArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
|
||||
@@ -582,6 +591,13 @@ type ModuleBase struct {
|
||||
archProperties [][]interface{}
|
||||
customizableProperties []interface{}
|
||||
|
||||
// Information about all the properties on the module that contains visibility rules that need
|
||||
// checking.
|
||||
visibilityPropertyInfo []visibilityProperty
|
||||
|
||||
// The primary visibility property, may be nil, that controls access to the module.
|
||||
primaryVisibilityProperty visibilityProperty
|
||||
|
||||
noAddressSanitizer bool
|
||||
installFiles Paths
|
||||
checkbuildFiles Paths
|
||||
@@ -668,10 +684,15 @@ func (m *ModuleBase) qualifiedModuleId(ctx BaseModuleContext) qualifiedModuleNam
|
||||
}
|
||||
|
||||
func (m *ModuleBase) visibilityProperties() []visibilityProperty {
|
||||
return []visibilityProperty{
|
||||
newVisibilityProperty("visibility", func() []string {
|
||||
return m.base().commonProperties.Visibility
|
||||
}),
|
||||
return m.visibilityPropertyInfo
|
||||
}
|
||||
|
||||
func (m *ModuleBase) visibility() []string {
|
||||
// The soong_namespace module does not initialize the primaryVisibilityProperty.
|
||||
if m.primaryVisibilityProperty != nil {
|
||||
return m.primaryVisibilityProperty.getStrings()
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user