blob: b48fd9148a55740fe7d7a492f993dde08616efe0 [file] [log] [blame]
Colin Cross3c0a83d2023-12-12 14:13:26 -08001package android
2
3import (
4 "github.com/google/blueprint"
5)
6
Colin Crossa6792772025-02-11 12:03:24 -08007// OtherModuleProviderContext is a helper interface that is a subset of ModuleContext or BottomUpMutatorContext
8// for use in OtherModuleProvider.
Colin Cross3c0a83d2023-12-12 14:13:26 -08009type OtherModuleProviderContext interface {
10 otherModuleProvider(m blueprint.Module, provider blueprint.AnyProviderKey) (any, bool)
11}
12
13var _ OtherModuleProviderContext = BaseModuleContext(nil)
14var _ OtherModuleProviderContext = ModuleContext(nil)
15var _ OtherModuleProviderContext = BottomUpMutatorContext(nil)
Yu Liu663e4502024-08-12 18:23:59 +000016var _ OtherModuleProviderContext = SingletonContext(nil)
17var _ OtherModuleProviderContext = (*TestContext)(nil)
Colin Cross3c0a83d2023-12-12 14:13:26 -080018
19// OtherModuleProvider reads the provider for the given module. If the provider has been set the value is
20// returned and the boolean is true. If it has not been set the zero value of the provider's type is returned
21// and the boolean is false. The value returned may be a deep copy of the value originally passed to SetProvider.
22//
Colin Crossa6792772025-02-11 12:03:24 -080023// OtherModuleProviderContext is a helper interface that accepts ModuleContext or BottomUpMutatorContext.
Colin Cross3c0a83d2023-12-12 14:13:26 -080024func OtherModuleProvider[K any](ctx OtherModuleProviderContext, module blueprint.Module, provider blueprint.ProviderKey[K]) (K, bool) {
Yu Liudd9ccb42024-10-07 17:07:44 +000025 value, ok := ctx.otherModuleProvider(getWrappedModule(module), provider)
Colin Cross3c0a83d2023-12-12 14:13:26 -080026 if !ok {
27 var k K
28 return k, false
29 }
30 return value.(K), ok
31}
32
Yu Liud46e5ae2024-08-15 18:46:17 +000033func OtherModuleProviderOrDefault[K any](ctx OtherModuleProviderContext, module blueprint.Module, provider blueprint.ProviderKey[K]) K {
34 value, _ := OtherModuleProvider(ctx, module, provider)
35 return value
36}
37
Colin Crossa6792772025-02-11 12:03:24 -080038// ModuleProviderContext is a helper interface that is a subset of ModuleContext or BottomUpMutatorContext
39// for use in ModuleProvider.
Colin Cross3c0a83d2023-12-12 14:13:26 -080040type ModuleProviderContext interface {
41 provider(provider blueprint.AnyProviderKey) (any, bool)
42}
43
44var _ ModuleProviderContext = BaseModuleContext(nil)
45var _ ModuleProviderContext = ModuleContext(nil)
46var _ ModuleProviderContext = BottomUpMutatorContext(nil)
Colin Cross3c0a83d2023-12-12 14:13:26 -080047
48// ModuleProvider reads the provider for the current module. If the provider has been set the value is
49// returned and the boolean is true. If it has not been set the zero value of the provider's type is returned
50// and the boolean is false. The value returned may be a deep copy of the value originally passed to SetProvider.
51//
Colin Crossa6792772025-02-11 12:03:24 -080052// ModuleProviderContext is a helper interface that accepts ModuleContext or BottomUpMutatorContext.
Colin Cross3c0a83d2023-12-12 14:13:26 -080053func ModuleProvider[K any](ctx ModuleProviderContext, provider blueprint.ProviderKey[K]) (K, bool) {
54 value, ok := ctx.provider(provider)
55 if !ok {
56 var k K
57 return k, false
58 }
59 return value.(K), ok
60}
61
Colin Crossa6792772025-02-11 12:03:24 -080062// SetProviderContext is a helper interface that is a subset of ModuleContext or BottomUpMutatorContext
63// for use in SetProvider.
Colin Cross3c0a83d2023-12-12 14:13:26 -080064type SetProviderContext interface {
Colin Cross24c1cbe2023-12-21 23:42:56 +000065 setProvider(provider blueprint.AnyProviderKey, value any)
Colin Cross3c0a83d2023-12-12 14:13:26 -080066}
67
68var _ SetProviderContext = BaseModuleContext(nil)
69var _ SetProviderContext = ModuleContext(nil)
70var _ SetProviderContext = BottomUpMutatorContext(nil)
Colin Cross3c0a83d2023-12-12 14:13:26 -080071
72// SetProvider sets the value for a provider for the current module. It panics if not called
73// during the appropriate mutator or GenerateBuildActions pass for the provider, if the value
74// is not of the appropriate type, or if the value has already been set. The value should not
75// be modified after being passed to SetProvider.
76//
Colin Crossa6792772025-02-11 12:03:24 -080077// SetProviderContext is a helper interface that accepts ModuleContext or BottomUpMutatorContext.
Colin Cross3c0a83d2023-12-12 14:13:26 -080078func SetProvider[K any](ctx SetProviderContext, provider blueprint.ProviderKey[K], value K) {
Colin Cross24c1cbe2023-12-21 23:42:56 +000079 ctx.setProvider(provider, value)
Colin Cross3c0a83d2023-12-12 14:13:26 -080080}
81
82var _ OtherModuleProviderContext = (*otherModuleProviderAdaptor)(nil)
83
84// An OtherModuleProviderFunc can be passed to NewOtherModuleProviderAdaptor to create an OtherModuleProviderContext
85// for use in tests.
86type OtherModuleProviderFunc func(module blueprint.Module, provider blueprint.AnyProviderKey) (any, bool)
87
88type otherModuleProviderAdaptor struct {
89 otherModuleProviderFunc OtherModuleProviderFunc
90}
91
92func (p *otherModuleProviderAdaptor) otherModuleProvider(module blueprint.Module, provider blueprint.AnyProviderKey) (any, bool) {
93 return p.otherModuleProviderFunc(module, provider)
94}
95
96// NewOtherModuleProviderAdaptor returns an OtherModuleProviderContext that proxies calls to otherModuleProvider to
97// the provided OtherModuleProviderFunc. It can be used in tests to unit test methods that need to call
98// android.OtherModuleProvider.
99func NewOtherModuleProviderAdaptor(otherModuleProviderFunc OtherModuleProviderFunc) OtherModuleProviderContext {
100 return &otherModuleProviderAdaptor{otherModuleProviderFunc}
101}