1package android 2 3import ( 4 "github.com/google/blueprint" 5) 6 7// OtherModuleProviderContext is a helper interface that is a subset of ModuleContext or BottomUpMutatorContext 8// for use in OtherModuleProvider. 9type 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) 16var _ OtherModuleProviderContext = SingletonContext(nil) 17var _ OtherModuleProviderContext = (*TestContext)(nil) 18 19// ConfigAndOtherModuleProviderContext is OtherModuleProviderContext + ConfigContext 20type ConfigAndOtherModuleProviderContext interface { 21 OtherModuleProviderContext 22 ConfigContext 23} 24 25// 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// 29// OtherModuleProviderContext is a helper interface that accepts ModuleContext or BottomUpMutatorContext. 30func OtherModuleProvider[K any](ctx OtherModuleProviderContext, module blueprint.Module, provider blueprint.ProviderKey[K]) (K, bool) { 31 value, ok := ctx.otherModuleProvider(getWrappedModule(module), provider) 32 if !ok { 33 var k K 34 return k, false 35 } 36 return value.(K), ok 37} 38 39func OtherModuleProviderOrDefault[K any](ctx OtherModuleProviderContext, module blueprint.Module, provider blueprint.ProviderKey[K]) K { 40 value, _ := OtherModuleProvider(ctx, module, provider) 41 return value 42} 43 44func 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 52// ModuleProviderContext is a helper interface that is a subset of ModuleContext or BottomUpMutatorContext 53// for use in ModuleProvider. 54type ModuleProviderContext interface { 55 provider(provider blueprint.AnyProviderKey) (any, bool) 56} 57 58var _ ModuleProviderContext = BaseModuleContext(nil) 59var _ ModuleProviderContext = ModuleContext(nil) 60var _ ModuleProviderContext = BottomUpMutatorContext(nil) 61 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// 66// ModuleProviderContext is a helper interface that accepts ModuleContext or BottomUpMutatorContext. 67func 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 76// SetProviderContext is a helper interface that is a subset of ModuleContext or BottomUpMutatorContext 77// for use in SetProvider. 78type SetProviderContext interface { 79 setProvider(provider blueprint.AnyProviderKey, value any) 80} 81 82var _ SetProviderContext = BaseModuleContext(nil) 83var _ SetProviderContext = ModuleContext(nil) 84var _ SetProviderContext = BottomUpMutatorContext(nil) 85 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// 91// SetProviderContext is a helper interface that accepts ModuleContext or BottomUpMutatorContext. 92func SetProvider[K any](ctx SetProviderContext, provider blueprint.ProviderKey[K], value K) { 93 ctx.setProvider(provider, value) 94} 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} 116