blob: aae93ef88ad297a41719eef7686c96edc805e0b4 [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
Yu Liuf22120f2025-03-13 18:36:35 +000044func OtherModulePointerProviderOrDefault[K *T, T any](ctx OtherModuleProviderContext, module blueprint.Module, provider blueprint.ProviderKey[K]) K {
45 if value, ok := OtherModuleProvider(ctx, module, provider); ok {
46 return value
47 }
48 var val T
49 return &val
50}
51
Colin Crossa6792772025-02-11 12:03:24 -080052// ModuleProviderContext is a helper interface that is a subset of ModuleContext or BottomUpMutatorContext
53// for use in ModuleProvider.
Colin Cross3c0a83d2023-12-12 14:13:26 -080054type ModuleProviderContext interface {
55 provider(provider blueprint.AnyProviderKey) (any, bool)
56}
57
58var _ ModuleProviderContext = BaseModuleContext(nil)
59var _ ModuleProviderContext = ModuleContext(nil)
60var _ ModuleProviderContext = BottomUpMutatorContext(nil)
Colin Cross3c0a83d2023-12-12 14:13:26 -080061
62// ModuleProvider reads the provider for the current module. If the provider has been set the value is
63// returned and the boolean is true. If it has not been set the zero value of the provider's type is returned
64// and the boolean is false. The value returned may be a deep copy of the value originally passed to SetProvider.
65//
Colin Crossa6792772025-02-11 12:03:24 -080066// ModuleProviderContext is a helper interface that accepts ModuleContext or BottomUpMutatorContext.
Colin Cross3c0a83d2023-12-12 14:13:26 -080067func ModuleProvider[K any](ctx ModuleProviderContext, provider blueprint.ProviderKey[K]) (K, bool) {
68 value, ok := ctx.provider(provider)
69 if !ok {
70 var k K
71 return k, false
72 }
73 return value.(K), ok
74}
75
Colin Crossa6792772025-02-11 12:03:24 -080076// SetProviderContext is a helper interface that is a subset of ModuleContext or BottomUpMutatorContext
77// for use in SetProvider.
Colin Cross3c0a83d2023-12-12 14:13:26 -080078type SetProviderContext interface {
Colin Cross24c1cbe2023-12-21 23:42:56 +000079 setProvider(provider blueprint.AnyProviderKey, value any)
Colin Cross3c0a83d2023-12-12 14:13:26 -080080}
81
82var _ SetProviderContext = BaseModuleContext(nil)
83var _ SetProviderContext = ModuleContext(nil)
84var _ SetProviderContext = BottomUpMutatorContext(nil)
Colin Cross3c0a83d2023-12-12 14:13:26 -080085
86// SetProvider sets the value for a provider for the current module. It panics if not called
87// during the appropriate mutator or GenerateBuildActions pass for the provider, if the value
88// is not of the appropriate type, or if the value has already been set. The value should not
89// be modified after being passed to SetProvider.
90//
Colin Crossa6792772025-02-11 12:03:24 -080091// SetProviderContext is a helper interface that accepts ModuleContext or BottomUpMutatorContext.
Colin Cross3c0a83d2023-12-12 14:13:26 -080092func SetProvider[K any](ctx SetProviderContext, provider blueprint.ProviderKey[K], value K) {
Colin Cross24c1cbe2023-12-21 23:42:56 +000093 ctx.setProvider(provider, value)
Colin Cross3c0a83d2023-12-12 14:13:26 -080094}
95
96var _ OtherModuleProviderContext = (*otherModuleProviderAdaptor)(nil)
97
98// An OtherModuleProviderFunc can be passed to NewOtherModuleProviderAdaptor to create an OtherModuleProviderContext
99// for use in tests.
100type OtherModuleProviderFunc func(module blueprint.Module, provider blueprint.AnyProviderKey) (any, bool)
101
102type otherModuleProviderAdaptor struct {
103 otherModuleProviderFunc OtherModuleProviderFunc
104}
105
106func (p *otherModuleProviderAdaptor) otherModuleProvider(module blueprint.Module, provider blueprint.AnyProviderKey) (any, bool) {
107 return p.otherModuleProviderFunc(module, provider)
108}
109
110// NewOtherModuleProviderAdaptor returns an OtherModuleProviderContext that proxies calls to otherModuleProvider to
111// the provided OtherModuleProviderFunc. It can be used in tests to unit test methods that need to call
112// android.OtherModuleProvider.
113func NewOtherModuleProviderAdaptor(otherModuleProviderFunc OtherModuleProviderFunc) OtherModuleProviderContext {
114 return &otherModuleProviderAdaptor{otherModuleProviderFunc}
115}