diff options
Diffstat (limited to 'android/singleton.go')
-rw-r--r-- | android/singleton.go | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/android/singleton.go b/android/singleton.go index 7ff96c9d5..7c6cf4fd6 100644 --- a/android/singleton.go +++ b/android/singleton.go @@ -29,6 +29,10 @@ type SingletonContext interface { ModuleType(module blueprint.Module) string BlueprintFile(module blueprint.Module) string + // ModuleVariantsFromName returns the list of module variants named `name` in the same namespace as `referer` enforcing visibility rules. + // Allows generating build actions for `referer` based on the metadata for `name` deferred until the singleton context. + ModuleVariantsFromName(referer Module, name string) []Module + // ModuleProvider returns the value, if any, for the provider for a module. If the value for the // provider was not set it returns the zero value of the type of the provider, which means the // return value can always be type-asserted to the type of the provider. The return value should @@ -251,3 +255,30 @@ func (s *singletonContextAdaptor) PrimaryModule(module Module) Module { func (s *singletonContextAdaptor) FinalModule(module Module) Module { return s.SingletonContext.FinalModule(module).(Module) } + +func (s *singletonContextAdaptor) ModuleVariantsFromName(referer Module, name string) []Module { + // get qualified module name for visibility enforcement + qualified := createQualifiedModuleName(s.ModuleName(referer), s.ModuleDir(referer)) + + modules := s.SingletonContext.ModuleVariantsFromName(referer, name) + result := make([]Module, 0, len(modules)) + for _, m := range modules { + if module, ok := m.(Module); ok { + // enforce visibility + depName := s.ModuleName(module) + depDir := s.ModuleDir(module) + depQualified := qualifiedModuleName{depDir, depName} + // Targets are always visible to other targets in their own package. + if depQualified.pkg != qualified.pkg { + rule := effectiveVisibilityRules(s.Config(), depQualified) + if !rule.matches(qualified) { + s.ModuleErrorf(referer, "module %q references %q which is not visible to this module\nYou may need to add %q to its visibility", + referer.Name(), depQualified, "//"+s.ModuleDir(referer)) + continue + } + } + result = append(result, module) + } + } + return result +} |