xref: /aosp_15_r20/build/soong/android/register.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage android
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"fmt"
19*333d2b36SAndroid Build Coastguard Worker	"reflect"
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
22*333d2b36SAndroid Build Coastguard Worker)
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Worker// A sortable component is one whose registration order affects the order in which it is executed
25*333d2b36SAndroid Build Coastguard Worker// and so affects the behavior of the build system. As a result it is important for the order in
26*333d2b36SAndroid Build Coastguard Worker// which they are registered during tests to match the order used at runtime and so the test
27*333d2b36SAndroid Build Coastguard Worker// infrastructure will sort them to match.
28*333d2b36SAndroid Build Coastguard Worker//
29*333d2b36SAndroid Build Coastguard Worker// The sortable components are mutators, singletons and pre-singletons. Module types are not
30*333d2b36SAndroid Build Coastguard Worker// sortable because their order of registration does not affect the runtime behavior.
31*333d2b36SAndroid Build Coastguard Workertype sortableComponent interface {
32*333d2b36SAndroid Build Coastguard Worker	// componentName returns the name of the component.
33*333d2b36SAndroid Build Coastguard Worker	//
34*333d2b36SAndroid Build Coastguard Worker	// Uniquely identifies the components within the set of components used at runtime and during
35*333d2b36SAndroid Build Coastguard Worker	// tests.
36*333d2b36SAndroid Build Coastguard Worker	componentName() string
37*333d2b36SAndroid Build Coastguard Worker
38*333d2b36SAndroid Build Coastguard Worker	// registers this component in the supplied context.
39*333d2b36SAndroid Build Coastguard Worker	register(ctx *Context)
40*333d2b36SAndroid Build Coastguard Worker}
41*333d2b36SAndroid Build Coastguard Worker
42*333d2b36SAndroid Build Coastguard Workertype sortableComponents []sortableComponent
43*333d2b36SAndroid Build Coastguard Worker
44*333d2b36SAndroid Build Coastguard Worker// registerAll registers all components in this slice with the supplied context.
45*333d2b36SAndroid Build Coastguard Workerfunc (r sortableComponents) registerAll(ctx *Context) {
46*333d2b36SAndroid Build Coastguard Worker	for _, c := range r {
47*333d2b36SAndroid Build Coastguard Worker		c.register(ctx)
48*333d2b36SAndroid Build Coastguard Worker	}
49*333d2b36SAndroid Build Coastguard Worker}
50*333d2b36SAndroid Build Coastguard Worker
51*333d2b36SAndroid Build Coastguard Workertype moduleType struct {
52*333d2b36SAndroid Build Coastguard Worker	name    string
53*333d2b36SAndroid Build Coastguard Worker	factory ModuleFactory
54*333d2b36SAndroid Build Coastguard Worker}
55*333d2b36SAndroid Build Coastguard Worker
56*333d2b36SAndroid Build Coastguard Workerfunc (t moduleType) register(ctx *Context) {
57*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType(t.name, ModuleFactoryAdaptor(t.factory))
58*333d2b36SAndroid Build Coastguard Worker}
59*333d2b36SAndroid Build Coastguard Worker
60*333d2b36SAndroid Build Coastguard Workervar moduleTypes []moduleType
61*333d2b36SAndroid Build Coastguard Workervar moduleTypesForDocs = map[string]reflect.Value{}
62*333d2b36SAndroid Build Coastguard Workervar moduleTypeByFactory = map[reflect.Value]string{}
63*333d2b36SAndroid Build Coastguard Worker
64*333d2b36SAndroid Build Coastguard Workertype singleton struct {
65*333d2b36SAndroid Build Coastguard Worker	// True if this should be registered as a parallel singleton.
66*333d2b36SAndroid Build Coastguard Worker	parallel bool
67*333d2b36SAndroid Build Coastguard Worker
68*333d2b36SAndroid Build Coastguard Worker	name    string
69*333d2b36SAndroid Build Coastguard Worker	factory SingletonFactory
70*333d2b36SAndroid Build Coastguard Worker}
71*333d2b36SAndroid Build Coastguard Worker
72*333d2b36SAndroid Build Coastguard Workerfunc newSingleton(name string, factory SingletonFactory, parallel bool) singleton {
73*333d2b36SAndroid Build Coastguard Worker	return singleton{parallel: parallel, name: name, factory: factory}
74*333d2b36SAndroid Build Coastguard Worker}
75*333d2b36SAndroid Build Coastguard Worker
76*333d2b36SAndroid Build Coastguard Workerfunc (s singleton) componentName() string {
77*333d2b36SAndroid Build Coastguard Worker	return s.name
78*333d2b36SAndroid Build Coastguard Worker}
79*333d2b36SAndroid Build Coastguard Worker
80*333d2b36SAndroid Build Coastguard Workerfunc (s singleton) register(ctx *Context) {
81*333d2b36SAndroid Build Coastguard Worker	adaptor := SingletonFactoryAdaptor(ctx, s.factory)
82*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterSingletonType(s.name, adaptor, s.parallel)
83*333d2b36SAndroid Build Coastguard Worker}
84*333d2b36SAndroid Build Coastguard Worker
85*333d2b36SAndroid Build Coastguard Workervar _ sortableComponent = singleton{}
86*333d2b36SAndroid Build Coastguard Worker
87*333d2b36SAndroid Build Coastguard Workervar singletons sortableComponents
88*333d2b36SAndroid Build Coastguard Worker
89*333d2b36SAndroid Build Coastguard Workertype mutator struct {
90*333d2b36SAndroid Build Coastguard Worker	name              string
91*333d2b36SAndroid Build Coastguard Worker	bottomUpMutator   blueprint.BottomUpMutator
92*333d2b36SAndroid Build Coastguard Worker	topDownMutator    blueprint.TopDownMutator
93*333d2b36SAndroid Build Coastguard Worker	transitionMutator blueprint.TransitionMutator
94*333d2b36SAndroid Build Coastguard Worker
95*333d2b36SAndroid Build Coastguard Worker	usesRename              bool
96*333d2b36SAndroid Build Coastguard Worker	usesReverseDependencies bool
97*333d2b36SAndroid Build Coastguard Worker	usesReplaceDependencies bool
98*333d2b36SAndroid Build Coastguard Worker	usesCreateModule        bool
99*333d2b36SAndroid Build Coastguard Worker	mutatesDependencies     bool
100*333d2b36SAndroid Build Coastguard Worker	mutatesGlobalState      bool
101*333d2b36SAndroid Build Coastguard Worker	neverFar                bool
102*333d2b36SAndroid Build Coastguard Worker}
103*333d2b36SAndroid Build Coastguard Worker
104*333d2b36SAndroid Build Coastguard Workervar _ sortableComponent = &mutator{}
105*333d2b36SAndroid Build Coastguard Worker
106*333d2b36SAndroid Build Coastguard Workertype ModuleFactory func() Module
107*333d2b36SAndroid Build Coastguard Worker
108*333d2b36SAndroid Build Coastguard Worker// ModuleFactoryAdaptor wraps a ModuleFactory into a blueprint.ModuleFactory by converting a Module
109*333d2b36SAndroid Build Coastguard Worker// into a blueprint.Module and a list of property structs
110*333d2b36SAndroid Build Coastguard Workerfunc ModuleFactoryAdaptor(factory ModuleFactory) blueprint.ModuleFactory {
111*333d2b36SAndroid Build Coastguard Worker	return func() (blueprint.Module, []interface{}) {
112*333d2b36SAndroid Build Coastguard Worker		module := factory()
113*333d2b36SAndroid Build Coastguard Worker		return module, module.GetProperties()
114*333d2b36SAndroid Build Coastguard Worker	}
115*333d2b36SAndroid Build Coastguard Worker}
116*333d2b36SAndroid Build Coastguard Worker
117*333d2b36SAndroid Build Coastguard Workertype SingletonFactory func() Singleton
118*333d2b36SAndroid Build Coastguard Worker
119*333d2b36SAndroid Build Coastguard Worker// SingletonFactoryAdaptor wraps a SingletonFactory into a blueprint.SingletonFactory by converting
120*333d2b36SAndroid Build Coastguard Worker// a Singleton into a blueprint.Singleton
121*333d2b36SAndroid Build Coastguard Workerfunc SingletonFactoryAdaptor(ctx *Context, factory SingletonFactory) blueprint.SingletonFactory {
122*333d2b36SAndroid Build Coastguard Worker	return func() blueprint.Singleton {
123*333d2b36SAndroid Build Coastguard Worker		singleton := factory()
124*333d2b36SAndroid Build Coastguard Worker		if makevars, ok := singleton.(SingletonMakeVarsProvider); ok {
125*333d2b36SAndroid Build Coastguard Worker			ctx.registerSingletonMakeVarsProvider(makevars)
126*333d2b36SAndroid Build Coastguard Worker		}
127*333d2b36SAndroid Build Coastguard Worker		return &singletonAdaptor{Singleton: singleton}
128*333d2b36SAndroid Build Coastguard Worker	}
129*333d2b36SAndroid Build Coastguard Worker}
130*333d2b36SAndroid Build Coastguard Worker
131*333d2b36SAndroid Build Coastguard Workerfunc RegisterModuleType(name string, factory ModuleFactory) {
132*333d2b36SAndroid Build Coastguard Worker	moduleTypes = append(moduleTypes, moduleType{name, factory})
133*333d2b36SAndroid Build Coastguard Worker	RegisterModuleTypeForDocs(name, reflect.ValueOf(factory))
134*333d2b36SAndroid Build Coastguard Worker}
135*333d2b36SAndroid Build Coastguard Worker
136*333d2b36SAndroid Build Coastguard Worker// RegisterModuleTypeForDocs associates a module type name with a reflect.Value of the factory
137*333d2b36SAndroid Build Coastguard Worker// function that has documentation for the module type.  It is normally called automatically
138*333d2b36SAndroid Build Coastguard Worker// by RegisterModuleType, but can be called manually after RegisterModuleType in order to
139*333d2b36SAndroid Build Coastguard Worker// override the factory method used for documentation, for example if the method passed to
140*333d2b36SAndroid Build Coastguard Worker// RegisterModuleType was a lambda.
141*333d2b36SAndroid Build Coastguard Workerfunc RegisterModuleTypeForDocs(name string, factory reflect.Value) {
142*333d2b36SAndroid Build Coastguard Worker	moduleTypesForDocs[name] = factory
143*333d2b36SAndroid Build Coastguard Worker	moduleTypeByFactory[factory] = name
144*333d2b36SAndroid Build Coastguard Worker}
145*333d2b36SAndroid Build Coastguard Worker
146*333d2b36SAndroid Build Coastguard Workerfunc registerSingletonType(name string, factory SingletonFactory, parallel bool) {
147*333d2b36SAndroid Build Coastguard Worker	singletons = append(singletons, newSingleton(name, factory, parallel))
148*333d2b36SAndroid Build Coastguard Worker}
149*333d2b36SAndroid Build Coastguard Worker
150*333d2b36SAndroid Build Coastguard Workerfunc RegisterSingletonType(name string, factory SingletonFactory) {
151*333d2b36SAndroid Build Coastguard Worker	registerSingletonType(name, factory, false)
152*333d2b36SAndroid Build Coastguard Worker}
153*333d2b36SAndroid Build Coastguard Worker
154*333d2b36SAndroid Build Coastguard Workerfunc RegisterParallelSingletonType(name string, factory SingletonFactory) {
155*333d2b36SAndroid Build Coastguard Worker	registerSingletonType(name, factory, true)
156*333d2b36SAndroid Build Coastguard Worker}
157*333d2b36SAndroid Build Coastguard Worker
158*333d2b36SAndroid Build Coastguard Workertype Context struct {
159*333d2b36SAndroid Build Coastguard Worker	*blueprint.Context
160*333d2b36SAndroid Build Coastguard Worker	config Config
161*333d2b36SAndroid Build Coastguard Worker}
162*333d2b36SAndroid Build Coastguard Worker
163*333d2b36SAndroid Build Coastguard Workerfunc NewContext(config Config) *Context {
164*333d2b36SAndroid Build Coastguard Worker	ctx := &Context{blueprint.NewContext(), config}
165*333d2b36SAndroid Build Coastguard Worker	ctx.SetSrcDir(absSrcDir)
166*333d2b36SAndroid Build Coastguard Worker	ctx.AddSourceRootDirs(config.SourceRootDirs()...)
167*333d2b36SAndroid Build Coastguard Worker	return ctx
168*333d2b36SAndroid Build Coastguard Worker}
169*333d2b36SAndroid Build Coastguard Worker
170*333d2b36SAndroid Build Coastguard Worker// Register the pipeline of singletons, module types, and mutators for
171*333d2b36SAndroid Build Coastguard Worker// generating build.ninja and other files for Kati, from Android.bp files.
172*333d2b36SAndroid Build Coastguard Workerfunc (ctx *Context) Register() {
173*333d2b36SAndroid Build Coastguard Worker	for _, t := range moduleTypes {
174*333d2b36SAndroid Build Coastguard Worker		t.register(ctx)
175*333d2b36SAndroid Build Coastguard Worker	}
176*333d2b36SAndroid Build Coastguard Worker
177*333d2b36SAndroid Build Coastguard Worker	mutators := collateGloballyRegisteredMutators()
178*333d2b36SAndroid Build Coastguard Worker	mutators.registerAll(ctx)
179*333d2b36SAndroid Build Coastguard Worker
180*333d2b36SAndroid Build Coastguard Worker	singletons := collateGloballyRegisteredSingletons()
181*333d2b36SAndroid Build Coastguard Worker	singletons.registerAll(ctx)
182*333d2b36SAndroid Build Coastguard Worker}
183*333d2b36SAndroid Build Coastguard Worker
184*333d2b36SAndroid Build Coastguard Workerfunc (ctx *Context) Config() Config {
185*333d2b36SAndroid Build Coastguard Worker	return ctx.config
186*333d2b36SAndroid Build Coastguard Worker}
187*333d2b36SAndroid Build Coastguard Worker
188*333d2b36SAndroid Build Coastguard Workerfunc (ctx *Context) registerSingletonMakeVarsProvider(makevars SingletonMakeVarsProvider) {
189*333d2b36SAndroid Build Coastguard Worker	registerSingletonMakeVarsProvider(ctx.config, makevars)
190*333d2b36SAndroid Build Coastguard Worker}
191*333d2b36SAndroid Build Coastguard Worker
192*333d2b36SAndroid Build Coastguard Workerfunc collateGloballyRegisteredSingletons() sortableComponents {
193*333d2b36SAndroid Build Coastguard Worker	allSingletons := append(sortableComponents(nil), singletons...)
194*333d2b36SAndroid Build Coastguard Worker	allSingletons = append(allSingletons,
195*333d2b36SAndroid Build Coastguard Worker		// Register phony just before makevars so it can write out its phony rules as Make rules
196*333d2b36SAndroid Build Coastguard Worker		singleton{parallel: false, name: "phony", factory: phonySingletonFactory},
197*333d2b36SAndroid Build Coastguard Worker
198*333d2b36SAndroid Build Coastguard Worker		// Register makevars after other singletons so they can export values through makevars
199*333d2b36SAndroid Build Coastguard Worker		singleton{parallel: false, name: "makevars", factory: makeVarsSingletonFunc},
200*333d2b36SAndroid Build Coastguard Worker
201*333d2b36SAndroid Build Coastguard Worker		// Register rawfiles and ninjadeps last so that they can track all used environment variables and
202*333d2b36SAndroid Build Coastguard Worker		// Ninja file dependencies stored in the config.
203*333d2b36SAndroid Build Coastguard Worker		singleton{parallel: false, name: "rawfiles", factory: rawFilesSingletonFactory},
204*333d2b36SAndroid Build Coastguard Worker		singleton{parallel: false, name: "ninjadeps", factory: ninjaDepsSingletonFactory},
205*333d2b36SAndroid Build Coastguard Worker	)
206*333d2b36SAndroid Build Coastguard Worker
207*333d2b36SAndroid Build Coastguard Worker	return allSingletons
208*333d2b36SAndroid Build Coastguard Worker}
209*333d2b36SAndroid Build Coastguard Worker
210*333d2b36SAndroid Build Coastguard Workerfunc ModuleTypeFactories() map[string]ModuleFactory {
211*333d2b36SAndroid Build Coastguard Worker	ret := make(map[string]ModuleFactory)
212*333d2b36SAndroid Build Coastguard Worker	for _, t := range moduleTypes {
213*333d2b36SAndroid Build Coastguard Worker		ret[t.name] = t.factory
214*333d2b36SAndroid Build Coastguard Worker	}
215*333d2b36SAndroid Build Coastguard Worker	return ret
216*333d2b36SAndroid Build Coastguard Worker}
217*333d2b36SAndroid Build Coastguard Worker
218*333d2b36SAndroid Build Coastguard Workerfunc ModuleTypeFactoriesForDocs() map[string]reflect.Value {
219*333d2b36SAndroid Build Coastguard Worker	return moduleTypesForDocs
220*333d2b36SAndroid Build Coastguard Worker}
221*333d2b36SAndroid Build Coastguard Worker
222*333d2b36SAndroid Build Coastguard Workerfunc ModuleTypeByFactory() map[reflect.Value]string {
223*333d2b36SAndroid Build Coastguard Worker	return moduleTypeByFactory
224*333d2b36SAndroid Build Coastguard Worker}
225*333d2b36SAndroid Build Coastguard Worker
226*333d2b36SAndroid Build Coastguard Worker// Interface for registering build components.
227*333d2b36SAndroid Build Coastguard Worker//
228*333d2b36SAndroid Build Coastguard Worker// Provided to allow registration of build components to be shared between the runtime
229*333d2b36SAndroid Build Coastguard Worker// and test environments.
230*333d2b36SAndroid Build Coastguard Workertype RegistrationContext interface {
231*333d2b36SAndroid Build Coastguard Worker	RegisterModuleType(name string, factory ModuleFactory)
232*333d2b36SAndroid Build Coastguard Worker	RegisterSingletonModuleType(name string, factory SingletonModuleFactory)
233*333d2b36SAndroid Build Coastguard Worker	RegisterParallelSingletonModuleType(name string, factory SingletonModuleFactory)
234*333d2b36SAndroid Build Coastguard Worker	RegisterParallelSingletonType(name string, factory SingletonFactory)
235*333d2b36SAndroid Build Coastguard Worker	RegisterSingletonType(name string, factory SingletonFactory)
236*333d2b36SAndroid Build Coastguard Worker	PreArchMutators(f RegisterMutatorFunc)
237*333d2b36SAndroid Build Coastguard Worker
238*333d2b36SAndroid Build Coastguard Worker	// Register pre arch mutators that are hard coded into mutator.go.
239*333d2b36SAndroid Build Coastguard Worker	//
240*333d2b36SAndroid Build Coastguard Worker	// Only registers mutators for testing, is a noop on the InitRegistrationContext.
241*333d2b36SAndroid Build Coastguard Worker	HardCodedPreArchMutators(f RegisterMutatorFunc)
242*333d2b36SAndroid Build Coastguard Worker
243*333d2b36SAndroid Build Coastguard Worker	PreDepsMutators(f RegisterMutatorFunc)
244*333d2b36SAndroid Build Coastguard Worker	PostDepsMutators(f RegisterMutatorFunc)
245*333d2b36SAndroid Build Coastguard Worker	PostApexMutators(f RegisterMutatorFunc)
246*333d2b36SAndroid Build Coastguard Worker	FinalDepsMutators(f RegisterMutatorFunc)
247*333d2b36SAndroid Build Coastguard Worker}
248*333d2b36SAndroid Build Coastguard Worker
249*333d2b36SAndroid Build Coastguard Worker// Used to register build components from an init() method, e.g.
250*333d2b36SAndroid Build Coastguard Worker//
251*333d2b36SAndroid Build Coastguard Worker//	init() {
252*333d2b36SAndroid Build Coastguard Worker//	  RegisterBuildComponents(android.InitRegistrationContext)
253*333d2b36SAndroid Build Coastguard Worker//	}
254*333d2b36SAndroid Build Coastguard Worker//
255*333d2b36SAndroid Build Coastguard Worker//	func RegisterBuildComponents(ctx android.RegistrationContext) {
256*333d2b36SAndroid Build Coastguard Worker//	  ctx.RegisterModuleType(...)
257*333d2b36SAndroid Build Coastguard Worker//	  ...
258*333d2b36SAndroid Build Coastguard Worker//	}
259*333d2b36SAndroid Build Coastguard Worker//
260*333d2b36SAndroid Build Coastguard Worker// Extracting the actual registration into a separate RegisterBuildComponents(ctx) function
261*333d2b36SAndroid Build Coastguard Worker// allows it to be used to initialize test context, e.g.
262*333d2b36SAndroid Build Coastguard Worker//
263*333d2b36SAndroid Build Coastguard Worker//	ctx := android.NewTestContext(config)
264*333d2b36SAndroid Build Coastguard Worker//	RegisterBuildComponents(ctx)
265*333d2b36SAndroid Build Coastguard Workervar InitRegistrationContext RegistrationContext = &initRegistrationContext{
266*333d2b36SAndroid Build Coastguard Worker	moduleTypes:    make(map[string]ModuleFactory),
267*333d2b36SAndroid Build Coastguard Worker	singletonTypes: make(map[string]SingletonFactory),
268*333d2b36SAndroid Build Coastguard Worker}
269*333d2b36SAndroid Build Coastguard Worker
270*333d2b36SAndroid Build Coastguard Worker// Make sure the TestContext implements RegistrationContext.
271*333d2b36SAndroid Build Coastguard Workervar _ RegistrationContext = (*TestContext)(nil)
272*333d2b36SAndroid Build Coastguard Worker
273*333d2b36SAndroid Build Coastguard Workertype initRegistrationContext struct {
274*333d2b36SAndroid Build Coastguard Worker	moduleTypes        map[string]ModuleFactory
275*333d2b36SAndroid Build Coastguard Worker	singletonTypes     map[string]SingletonFactory
276*333d2b36SAndroid Build Coastguard Worker	moduleTypesForDocs map[string]reflect.Value
277*333d2b36SAndroid Build Coastguard Worker}
278*333d2b36SAndroid Build Coastguard Worker
279*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) RegisterModuleType(name string, factory ModuleFactory) {
280*333d2b36SAndroid Build Coastguard Worker	if _, present := ctx.moduleTypes[name]; present {
281*333d2b36SAndroid Build Coastguard Worker		panic(fmt.Sprintf("module type %q is already registered", name))
282*333d2b36SAndroid Build Coastguard Worker	}
283*333d2b36SAndroid Build Coastguard Worker	ctx.moduleTypes[name] = factory
284*333d2b36SAndroid Build Coastguard Worker	RegisterModuleType(name, factory)
285*333d2b36SAndroid Build Coastguard Worker	RegisterModuleTypeForDocs(name, reflect.ValueOf(factory))
286*333d2b36SAndroid Build Coastguard Worker}
287*333d2b36SAndroid Build Coastguard Worker
288*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) RegisterSingletonModuleType(name string, factory SingletonModuleFactory) {
289*333d2b36SAndroid Build Coastguard Worker	ctx.registerSingletonModuleType(name, factory, false)
290*333d2b36SAndroid Build Coastguard Worker}
291*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) RegisterParallelSingletonModuleType(name string, factory SingletonModuleFactory) {
292*333d2b36SAndroid Build Coastguard Worker	ctx.registerSingletonModuleType(name, factory, true)
293*333d2b36SAndroid Build Coastguard Worker}
294*333d2b36SAndroid Build Coastguard Worker
295*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) registerSingletonModuleType(name string, factory SingletonModuleFactory, parallel bool) {
296*333d2b36SAndroid Build Coastguard Worker	s, m := SingletonModuleFactoryAdaptor(name, factory)
297*333d2b36SAndroid Build Coastguard Worker	ctx.registerSingletonType(name, s, parallel)
298*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType(name, m)
299*333d2b36SAndroid Build Coastguard Worker	// Overwrite moduleTypesForDocs with the original factory instead of the lambda returned by
300*333d2b36SAndroid Build Coastguard Worker	// SingletonModuleFactoryAdaptor so that docs can find the module type documentation on the
301*333d2b36SAndroid Build Coastguard Worker	// factory method.
302*333d2b36SAndroid Build Coastguard Worker	RegisterModuleTypeForDocs(name, reflect.ValueOf(factory))
303*333d2b36SAndroid Build Coastguard Worker}
304*333d2b36SAndroid Build Coastguard Worker
305*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) registerSingletonType(name string, factory SingletonFactory, parallel bool) {
306*333d2b36SAndroid Build Coastguard Worker	if _, present := ctx.singletonTypes[name]; present {
307*333d2b36SAndroid Build Coastguard Worker		panic(fmt.Sprintf("singleton type %q is already registered", name))
308*333d2b36SAndroid Build Coastguard Worker	}
309*333d2b36SAndroid Build Coastguard Worker	ctx.singletonTypes[name] = factory
310*333d2b36SAndroid Build Coastguard Worker	registerSingletonType(name, factory, parallel)
311*333d2b36SAndroid Build Coastguard Worker}
312*333d2b36SAndroid Build Coastguard Worker
313*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) RegisterSingletonType(name string, factory SingletonFactory) {
314*333d2b36SAndroid Build Coastguard Worker	ctx.registerSingletonType(name, factory, false)
315*333d2b36SAndroid Build Coastguard Worker}
316*333d2b36SAndroid Build Coastguard Worker
317*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) RegisterParallelSingletonType(name string, factory SingletonFactory) {
318*333d2b36SAndroid Build Coastguard Worker	ctx.registerSingletonType(name, factory, true)
319*333d2b36SAndroid Build Coastguard Worker}
320*333d2b36SAndroid Build Coastguard Worker
321*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) PreArchMutators(f RegisterMutatorFunc) {
322*333d2b36SAndroid Build Coastguard Worker	PreArchMutators(f)
323*333d2b36SAndroid Build Coastguard Worker}
324*333d2b36SAndroid Build Coastguard Worker
325*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) HardCodedPreArchMutators(_ RegisterMutatorFunc) {
326*333d2b36SAndroid Build Coastguard Worker	// Nothing to do as the mutators are hard code in preArch in mutator.go
327*333d2b36SAndroid Build Coastguard Worker}
328*333d2b36SAndroid Build Coastguard Worker
329*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) PreDepsMutators(f RegisterMutatorFunc) {
330*333d2b36SAndroid Build Coastguard Worker	PreDepsMutators(f)
331*333d2b36SAndroid Build Coastguard Worker}
332*333d2b36SAndroid Build Coastguard Worker
333*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) PostDepsMutators(f RegisterMutatorFunc) {
334*333d2b36SAndroid Build Coastguard Worker	PostDepsMutators(f)
335*333d2b36SAndroid Build Coastguard Worker}
336*333d2b36SAndroid Build Coastguard Worker
337*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) PostApexMutators(f RegisterMutatorFunc) {
338*333d2b36SAndroid Build Coastguard Worker	PostApexMutators(f)
339*333d2b36SAndroid Build Coastguard Worker}
340*333d2b36SAndroid Build Coastguard Worker
341*333d2b36SAndroid Build Coastguard Workerfunc (ctx *initRegistrationContext) FinalDepsMutators(f RegisterMutatorFunc) {
342*333d2b36SAndroid Build Coastguard Worker	FinalDepsMutators(f)
343*333d2b36SAndroid Build Coastguard Worker}
344