Allow deferred module build action generation.
Provide a means to generate build actions for modules from within the later singleton context. Allows modules to depend on the metadata for arbitrary modules without causing dependency cycles. Care needs to be taken to establish all metadata during the normal module GenerateBuildAction to avoid synchronization issues and only use read-only access to modules from the singleton context. Bug: 213388645 Change-Id: I82ed218926b1d8fbe2edde6d55c4bf40ea0d8618
This commit is contained in:
parent
cdbab1ea51
commit
67a6d702d1
1 changed files with 27 additions and 0 deletions
|
@ -157,6 +157,10 @@ type SingletonContext interface {
|
||||||
// Fs returns a pathtools.Filesystem that can be used to interact with files. Using the Filesystem interface allows
|
// Fs returns a pathtools.Filesystem that can be used to interact with files. Using the Filesystem interface allows
|
||||||
// the singleton to be used in build system tests that run against a mock filesystem.
|
// the singleton to be used in build system tests that run against a mock filesystem.
|
||||||
Fs() pathtools.FileSystem
|
Fs() pathtools.FileSystem
|
||||||
|
|
||||||
|
// ModuleVariantsFromName returns the list of module variants named `name` in the same namespace as `referer`.
|
||||||
|
// Allows generating build actions for `referer` based on the metadata for `name` deferred until the singleton context.
|
||||||
|
ModuleVariantsFromName(referer Module, name string) []Module
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ SingletonContext = (*singletonContext)(nil)
|
var _ SingletonContext = (*singletonContext)(nil)
|
||||||
|
@ -369,3 +373,26 @@ func (s *singletonContext) GlobWithDeps(pattern string,
|
||||||
func (s *singletonContext) Fs() pathtools.FileSystem {
|
func (s *singletonContext) Fs() pathtools.FileSystem {
|
||||||
return s.context.fs
|
return s.context.fs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *singletonContext) ModuleVariantsFromName(referer Module, name string) []Module {
|
||||||
|
c := s.context
|
||||||
|
|
||||||
|
refererInfo := c.moduleInfo[referer]
|
||||||
|
if refererInfo == nil {
|
||||||
|
s.ModuleErrorf(referer, "could not find module %q", referer.Name())
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
moduleGroup, exists := c.nameInterface.ModuleFromName(name, refererInfo.namespace())
|
||||||
|
if !exists {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
result := make([]Module, 0, len(moduleGroup.modules))
|
||||||
|
for _, module := range moduleGroup.modules {
|
||||||
|
moduleInfo := module.module()
|
||||||
|
if moduleInfo != nil {
|
||||||
|
result = append(result, moduleInfo.logicModule)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue