xref: /aosp_15_r20/build/soong/android/provider.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Workerpackage android
2*333d2b36SAndroid Build Coastguard Worker
3*333d2b36SAndroid Build Coastguard Workerimport (
4*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
5*333d2b36SAndroid Build Coastguard Worker)
6*333d2b36SAndroid Build Coastguard Worker
7*333d2b36SAndroid Build Coastguard Worker// OtherModuleProviderContext is a helper interface that is a subset of ModuleContext, BottomUpMutatorContext, or
8*333d2b36SAndroid Build Coastguard Worker// TopDownMutatorContext for use in OtherModuleProvider.
9*333d2b36SAndroid Build Coastguard Workertype OtherModuleProviderContext interface {
10*333d2b36SAndroid Build Coastguard Worker	otherModuleProvider(m blueprint.Module, provider blueprint.AnyProviderKey) (any, bool)
11*333d2b36SAndroid Build Coastguard Worker}
12*333d2b36SAndroid Build Coastguard Worker
13*333d2b36SAndroid Build Coastguard Workervar _ OtherModuleProviderContext = BaseModuleContext(nil)
14*333d2b36SAndroid Build Coastguard Workervar _ OtherModuleProviderContext = ModuleContext(nil)
15*333d2b36SAndroid Build Coastguard Workervar _ OtherModuleProviderContext = BottomUpMutatorContext(nil)
16*333d2b36SAndroid Build Coastguard Workervar _ OtherModuleProviderContext = TopDownMutatorContext(nil)
17*333d2b36SAndroid Build Coastguard Workervar _ OtherModuleProviderContext = SingletonContext(nil)
18*333d2b36SAndroid Build Coastguard Workervar _ OtherModuleProviderContext = (*TestContext)(nil)
19*333d2b36SAndroid Build Coastguard Worker
20*333d2b36SAndroid Build Coastguard Worker// OtherModuleProvider reads the provider for the given module.  If the provider has been set the value is
21*333d2b36SAndroid Build Coastguard Worker// returned and the boolean is true.  If it has not been set the zero value of the provider's type  is returned
22*333d2b36SAndroid Build Coastguard Worker// and the boolean is false.  The value returned may be a deep copy of the value originally passed to SetProvider.
23*333d2b36SAndroid Build Coastguard Worker//
24*333d2b36SAndroid Build Coastguard Worker// OtherModuleProviderContext is a helper interface that accepts ModuleContext, BottomUpMutatorContext, or
25*333d2b36SAndroid Build Coastguard Worker// TopDownMutatorContext.
26*333d2b36SAndroid Build Coastguard Workerfunc OtherModuleProvider[K any](ctx OtherModuleProviderContext, module blueprint.Module, provider blueprint.ProviderKey[K]) (K, bool) {
27*333d2b36SAndroid Build Coastguard Worker	value, ok := ctx.otherModuleProvider(getWrappedModule(module), provider)
28*333d2b36SAndroid Build Coastguard Worker	if !ok {
29*333d2b36SAndroid Build Coastguard Worker		var k K
30*333d2b36SAndroid Build Coastguard Worker		return k, false
31*333d2b36SAndroid Build Coastguard Worker	}
32*333d2b36SAndroid Build Coastguard Worker	return value.(K), ok
33*333d2b36SAndroid Build Coastguard Worker}
34*333d2b36SAndroid Build Coastguard Worker
35*333d2b36SAndroid Build Coastguard Workerfunc OtherModuleProviderOrDefault[K any](ctx OtherModuleProviderContext, module blueprint.Module, provider blueprint.ProviderKey[K]) K {
36*333d2b36SAndroid Build Coastguard Worker	value, _ := OtherModuleProvider(ctx, module, provider)
37*333d2b36SAndroid Build Coastguard Worker	return value
38*333d2b36SAndroid Build Coastguard Worker}
39*333d2b36SAndroid Build Coastguard Worker
40*333d2b36SAndroid Build Coastguard Worker// ModuleProviderContext is a helper interface that is a subset of ModuleContext, BottomUpMutatorContext, or
41*333d2b36SAndroid Build Coastguard Worker// TopDownMutatorContext for use in ModuleProvider.
42*333d2b36SAndroid Build Coastguard Workertype ModuleProviderContext interface {
43*333d2b36SAndroid Build Coastguard Worker	provider(provider blueprint.AnyProviderKey) (any, bool)
44*333d2b36SAndroid Build Coastguard Worker}
45*333d2b36SAndroid Build Coastguard Worker
46*333d2b36SAndroid Build Coastguard Workervar _ ModuleProviderContext = BaseModuleContext(nil)
47*333d2b36SAndroid Build Coastguard Workervar _ ModuleProviderContext = ModuleContext(nil)
48*333d2b36SAndroid Build Coastguard Workervar _ ModuleProviderContext = BottomUpMutatorContext(nil)
49*333d2b36SAndroid Build Coastguard Workervar _ ModuleProviderContext = TopDownMutatorContext(nil)
50*333d2b36SAndroid Build Coastguard Worker
51*333d2b36SAndroid Build Coastguard Worker// ModuleProvider reads the provider for the current module.  If the provider has been set the value is
52*333d2b36SAndroid Build Coastguard Worker// returned and the boolean is true.  If it has not been set the zero value of the provider's type  is returned
53*333d2b36SAndroid Build Coastguard Worker// and the boolean is false.  The value returned may be a deep copy of the value originally passed to SetProvider.
54*333d2b36SAndroid Build Coastguard Worker//
55*333d2b36SAndroid Build Coastguard Worker// ModuleProviderContext is a helper interface that accepts ModuleContext, BottomUpMutatorContext, or
56*333d2b36SAndroid Build Coastguard Worker// TopDownMutatorContext.
57*333d2b36SAndroid Build Coastguard Workerfunc ModuleProvider[K any](ctx ModuleProviderContext, provider blueprint.ProviderKey[K]) (K, bool) {
58*333d2b36SAndroid Build Coastguard Worker	value, ok := ctx.provider(provider)
59*333d2b36SAndroid Build Coastguard Worker	if !ok {
60*333d2b36SAndroid Build Coastguard Worker		var k K
61*333d2b36SAndroid Build Coastguard Worker		return k, false
62*333d2b36SAndroid Build Coastguard Worker	}
63*333d2b36SAndroid Build Coastguard Worker	return value.(K), ok
64*333d2b36SAndroid Build Coastguard Worker}
65*333d2b36SAndroid Build Coastguard Worker
66*333d2b36SAndroid Build Coastguard Worker// SetProviderContext is a helper interface that is a subset of ModuleContext, BottomUpMutatorContext, or
67*333d2b36SAndroid Build Coastguard Worker// TopDownMutatorContext for use in SetProvider.
68*333d2b36SAndroid Build Coastguard Workertype SetProviderContext interface {
69*333d2b36SAndroid Build Coastguard Worker	setProvider(provider blueprint.AnyProviderKey, value any)
70*333d2b36SAndroid Build Coastguard Worker}
71*333d2b36SAndroid Build Coastguard Worker
72*333d2b36SAndroid Build Coastguard Workervar _ SetProviderContext = BaseModuleContext(nil)
73*333d2b36SAndroid Build Coastguard Workervar _ SetProviderContext = ModuleContext(nil)
74*333d2b36SAndroid Build Coastguard Workervar _ SetProviderContext = BottomUpMutatorContext(nil)
75*333d2b36SAndroid Build Coastguard Workervar _ SetProviderContext = TopDownMutatorContext(nil)
76*333d2b36SAndroid Build Coastguard Worker
77*333d2b36SAndroid Build Coastguard Worker// SetProvider sets the value for a provider for the current module.  It panics if not called
78*333d2b36SAndroid Build Coastguard Worker// during the appropriate mutator or GenerateBuildActions pass for the provider, if the value
79*333d2b36SAndroid Build Coastguard Worker// is not of the appropriate type, or if the value has already been set.  The value should not
80*333d2b36SAndroid Build Coastguard Worker// be modified after being passed to SetProvider.
81*333d2b36SAndroid Build Coastguard Worker//
82*333d2b36SAndroid Build Coastguard Worker// SetProviderContext is a helper interface that accepts ModuleContext, BottomUpMutatorContext, or
83*333d2b36SAndroid Build Coastguard Worker// TopDownMutatorContext.
84*333d2b36SAndroid Build Coastguard Workerfunc SetProvider[K any](ctx SetProviderContext, provider blueprint.ProviderKey[K], value K) {
85*333d2b36SAndroid Build Coastguard Worker	ctx.setProvider(provider, value)
86*333d2b36SAndroid Build Coastguard Worker}
87*333d2b36SAndroid Build Coastguard Worker
88*333d2b36SAndroid Build Coastguard Workervar _ OtherModuleProviderContext = (*otherModuleProviderAdaptor)(nil)
89*333d2b36SAndroid Build Coastguard Worker
90*333d2b36SAndroid Build Coastguard Worker// An OtherModuleProviderFunc can be passed to NewOtherModuleProviderAdaptor to create an OtherModuleProviderContext
91*333d2b36SAndroid Build Coastguard Worker// for use in tests.
92*333d2b36SAndroid Build Coastguard Workertype OtherModuleProviderFunc func(module blueprint.Module, provider blueprint.AnyProviderKey) (any, bool)
93*333d2b36SAndroid Build Coastguard Worker
94*333d2b36SAndroid Build Coastguard Workertype otherModuleProviderAdaptor struct {
95*333d2b36SAndroid Build Coastguard Worker	otherModuleProviderFunc OtherModuleProviderFunc
96*333d2b36SAndroid Build Coastguard Worker}
97*333d2b36SAndroid Build Coastguard Worker
98*333d2b36SAndroid Build Coastguard Workerfunc (p *otherModuleProviderAdaptor) otherModuleProvider(module blueprint.Module, provider blueprint.AnyProviderKey) (any, bool) {
99*333d2b36SAndroid Build Coastguard Worker	return p.otherModuleProviderFunc(module, provider)
100*333d2b36SAndroid Build Coastguard Worker}
101*333d2b36SAndroid Build Coastguard Worker
102*333d2b36SAndroid Build Coastguard Worker// NewOtherModuleProviderAdaptor returns an OtherModuleProviderContext that proxies calls to otherModuleProvider to
103*333d2b36SAndroid Build Coastguard Worker// the provided OtherModuleProviderFunc.  It can be used in tests to unit test methods that need to call
104*333d2b36SAndroid Build Coastguard Worker// android.OtherModuleProvider.
105*333d2b36SAndroid Build Coastguard Workerfunc NewOtherModuleProviderAdaptor(otherModuleProviderFunc OtherModuleProviderFunc) OtherModuleProviderContext {
106*333d2b36SAndroid Build Coastguard Worker	return &otherModuleProviderAdaptor{otherModuleProviderFunc}
107*333d2b36SAndroid Build Coastguard Worker}
108