1463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross// Copyright 2015 Google Inc. All rights reserved.
2463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross//
3463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross// Licensed under the Apache License, Version 2.0 (the "License");
4463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross// you may not use this file except in compliance with the License.
5463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross// You may obtain a copy of the License at
6463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross//
7463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross//     http://www.apache.org/licenses/LICENSE-2.0
8463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross//
9463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross// Unless required by applicable law or agreed to in writing, software
10463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross// distributed under the License is distributed on an "AS IS" BASIS,
11463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross// See the License for the specific language governing permissions and
13463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross// limitations under the License.
14463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross
15463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Crosspackage soong
16463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross
17463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Crossimport "github.com/google/blueprint"
18463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross
19463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Crosstype moduleType struct {
20463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross	name    string
21463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross	factory blueprint.ModuleFactory
22463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross}
23463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross
24463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Crossvar moduleTypes []moduleType
25463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross
26463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Crosstype singleton struct {
27463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross	name    string
28463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross	factory blueprint.SingletonFactory
29463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross}
30463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross
31463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Crossvar singletons []singleton
32463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross
336362e278481ea0cb14d31cd7fd3760116b6d7643Colin Crosstype mutator struct {
346362e278481ea0cb14d31cd7fd3760116b6d7643Colin Cross	name            string
356362e278481ea0cb14d31cd7fd3760116b6d7643Colin Cross	bottomUpMutator blueprint.BottomUpMutator
366362e278481ea0cb14d31cd7fd3760116b6d7643Colin Cross	topDownMutator  blueprint.TopDownMutator
37463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross}
38463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross
396362e278481ea0cb14d31cd7fd3760116b6d7643Colin Crossvar mutators []mutator
40463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross
41463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Crossfunc RegisterModuleType(name string, factory blueprint.ModuleFactory) {
42463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross	moduleTypes = append(moduleTypes, moduleType{name, factory})
43463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross}
44463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross
45463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Crossfunc RegisterSingletonType(name string, factory blueprint.SingletonFactory) {
46463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross	singletons = append(singletons, singleton{name, factory})
47463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross}
48463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross
496362e278481ea0cb14d31cd7fd3760116b6d7643Colin Crossfunc RegisterBottomUpMutator(name string, m blueprint.BottomUpMutator) {
506362e278481ea0cb14d31cd7fd3760116b6d7643Colin Cross	mutators = append(mutators, mutator{name: name, bottomUpMutator: m})
516362e278481ea0cb14d31cd7fd3760116b6d7643Colin Cross}
526362e278481ea0cb14d31cd7fd3760116b6d7643Colin Cross
536362e278481ea0cb14d31cd7fd3760116b6d7643Colin Crossfunc RegisterTopDownMutator(name string, m blueprint.TopDownMutator) {
546362e278481ea0cb14d31cd7fd3760116b6d7643Colin Cross	mutators = append(mutators, mutator{name: name, topDownMutator: m})
55463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross}
56463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross
57463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Crossfunc NewContext() *blueprint.Context {
58463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross	ctx := blueprint.NewContext()
59463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross
60463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross	for _, t := range moduleTypes {
61463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross		ctx.RegisterModuleType(t.name, t.factory)
62463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross	}
63463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross
64463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross	for _, t := range singletons {
65463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross		ctx.RegisterSingletonType(t.name, t.factory)
66463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross	}
67463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross
686362e278481ea0cb14d31cd7fd3760116b6d7643Colin Cross	for _, t := range mutators {
696362e278481ea0cb14d31cd7fd3760116b6d7643Colin Cross		if t.bottomUpMutator != nil {
706362e278481ea0cb14d31cd7fd3760116b6d7643Colin Cross			ctx.RegisterBottomUpMutator(t.name, t.bottomUpMutator)
716362e278481ea0cb14d31cd7fd3760116b6d7643Colin Cross		}
726362e278481ea0cb14d31cd7fd3760116b6d7643Colin Cross		if t.topDownMutator != nil {
736362e278481ea0cb14d31cd7fd3760116b6d7643Colin Cross			ctx.RegisterTopDownMutator(t.name, t.topDownMutator)
746362e278481ea0cb14d31cd7fd3760116b6d7643Colin Cross		}
75463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross	}
76463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross
77463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross	return ctx
78463a90e5872d6c8cf26a2302e7ad1586957304a0Colin Cross}
79