blob: d005daf558d81b9b64134c9b43ab7a2635245350 [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
Cole Fausta8437c52025-02-25 14:45:43 -080019// ConfigAndOtherModuleProviderContext is OtherModuleProviderContext + ConfigContext
20type ConfigAndOtherModuleProviderContext interface {
21 OtherModuleProviderContext
22 ConfigContext
23}
24
Colin Cross3c0a83d2023-12-12 14:13:26 -080025// OtherModuleProvider reads the provider for the given module. If the provider has been set the value is
26// returned and the boolean is true. If it has not been set the zero value of the provider's type is returned
27// and the boolean is false. The value returned may be a deep copy of the value originally passed to SetProvider.
28//
Colin Crossa6792772025-02-11 12:03:24 -080029// OtherModuleProviderContext is a helper interface that accepts ModuleContext or BottomUpMutatorContext.
Colin Cross3c0a83d2023-12-12 14:13:26 -080030func OtherModuleProvider[K any](ctx OtherModuleProviderContext, module blueprint.Module, provider blueprint.ProviderKey[K]) (K, bool) {
Yu Liudd9ccb42024-10-07 17:07:44 +000031 value, ok := ctx.otherModuleProvider(getWrappedModule(module), provider)
Colin Cross3c0a83d2023-12-12 14:13:26 -080032 if !ok {
33 var k K
34 return k, false
35 }
36 return value.(K), ok
37}
38
Yu Liud46e5ae2024-08-15 18:46:17 +000039func OtherModuleProviderOrDefault[K any](ctx OtherModuleProviderContext, module blueprint.Module, provider blueprint.ProviderKey[K]) K {
40 value, _ := OtherModuleProvider(ctx, module, provider)
41 return value
42}
43
Colin Crossa6792772025-02-11 12:03:24 -080044// ModuleProviderContext is a helper interface that is a subset of ModuleContext or BottomUpMutatorContext
45// for use in ModuleProvider.
Colin Cross3c0a83d2023-12-12 14:13:26 -080046type ModuleProviderContext interface {
47 provider(provider blueprint.AnyProviderKey) (any, bool)
48}
49
50var _ ModuleProviderContext = BaseModuleContext(nil)
51var _ ModuleProviderContext = ModuleContext(nil)
52var _ ModuleProviderContext = BottomUpMutatorContext(nil)
Colin Cross3c0a83d2023-12-12 14:13:26 -080053
54// ModuleProvider reads the provider for the current module. If the provider has been set the value is
55// returned and the boolean is true. If it has not been set the zero value of the provider's type is returned
56// and the boolean is false. The value returned may be a deep copy of the value originally passed to SetProvider.
57//
Colin Crossa6792772025-02-11 12:03:24 -080058// ModuleProviderContext is a helper interface that accepts ModuleContext or BottomUpMutatorContext.
Colin Cross3c0a83d2023-12-12 14:13:26 -080059func ModuleProvider[K any](ctx ModuleProviderContext, provider blueprint.ProviderKey[K]) (K, bool) {
60 value, ok := ctx.provider(provider)
61 if !ok {
62 var k K
63 return k, false
64 }
65 return value.(K), ok
66}
67
Colin Crossa6792772025-02-11 12:03:24 -080068// SetProviderContext is a helper interface that is a subset of ModuleContext or BottomUpMutatorContext
69// for use in SetProvider.
Colin Cross3c0a83d2023-12-12 14:13:26 -080070type SetProviderContext interface {
Colin Cross24c1cbe2023-12-21 23:42:56 +000071 setProvider(provider blueprint.AnyProviderKey, value any)
Colin Cross3c0a83d2023-12-12 14:13:26 -080072}
73
74var _ SetProviderContext = BaseModuleContext(nil)
75var _ SetProviderContext = ModuleContext(nil)
76var _ SetProviderContext = BottomUpMutatorContext(nil)
Colin Cross3c0a83d2023-12-12 14:13:26 -080077
78// SetProvider sets the value for a provider for the current module. It panics if not called
79// during the appropriate mutator or GenerateBuildActions pass for the provider, if the value
80// is not of the appropriate type, or if the value has already been set. The value should not
81// be modified after being passed to SetProvider.
82//
Colin Crossa6792772025-02-11 12:03:24 -080083// SetProviderContext is a helper interface that accepts ModuleContext or BottomUpMutatorContext.
Colin Cross3c0a83d2023-12-12 14:13:26 -080084func SetProvider[K any](ctx SetProviderContext, provider blueprint.ProviderKey[K], value K) {
Colin Cross24c1cbe2023-12-21 23:42:56 +000085 ctx.setProvider(provider, value)
Colin Cross3c0a83d2023-12-12 14:13:26 -080086}
87
88var _ OtherModuleProviderContext = (*otherModuleProviderAdaptor)(nil)
89
90// An OtherModuleProviderFunc can be passed to NewOtherModuleProviderAdaptor to create an OtherModuleProviderContext
91// for use in tests.
92type OtherModuleProviderFunc func(module blueprint.Module, provider blueprint.AnyProviderKey) (any, bool)
93
94type otherModuleProviderAdaptor struct {
95 otherModuleProviderFunc OtherModuleProviderFunc
96}
97
98func (p *otherModuleProviderAdaptor) otherModuleProvider(module blueprint.Module, provider blueprint.AnyProviderKey) (any, bool) {
99 return p.otherModuleProviderFunc(module, provider)
100}
101
102// NewOtherModuleProviderAdaptor returns an OtherModuleProviderContext that proxies calls to otherModuleProvider to
103// the provided OtherModuleProviderFunc. It can be used in tests to unit test methods that need to call
104// android.OtherModuleProvider.
105func NewOtherModuleProviderAdaptor(otherModuleProviderFunc OtherModuleProviderFunc) OtherModuleProviderContext {
106 return &otherModuleProviderAdaptor{otherModuleProviderFunc}
107}