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