Merge "Add support for transitive sdk members" am: 7be7886960

Change-Id: Icd8a0bde8157871250d980cc260794cd039da35b
This commit is contained in:
Automerger Merge Worker 2020-02-07 17:38:02 +00:00
commit c5518698b6
2 changed files with 28 additions and 10 deletions

View File

@ -264,6 +264,13 @@ type SdkMemberType interface {
// True if the member type supports the sdk/sdk_snapshot, false otherwise.
UsableWithSdkAndSdkSnapshot() bool
// Return true if modules of this type can have dependencies which should be
// treated as if they are sdk members.
//
// Any dependency that is to be treated as a member of the sdk needs to implement
// SdkAware and be added with an SdkMemberTypeDependencyTag tag.
HasTransitiveSdkMembers() bool
// Add dependencies from the SDK module to all the variants the member
// contributes to the SDK. The exact set of variants required is determined
// by the SDK and its properties. The dependencies must be added with the
@ -291,8 +298,9 @@ type SdkMemberType interface {
// Base type for SdkMemberType implementations.
type SdkMemberTypeBase struct {
PropertyName string
SupportsSdk bool
PropertyName string
SupportsSdk bool
TransitiveSdkMembers bool
}
func (b *SdkMemberTypeBase) SdkPropertyName() string {
@ -303,6 +311,10 @@ func (b *SdkMemberTypeBase) UsableWithSdkAndSdkSnapshot() bool {
return b.SupportsSdk
}
func (b *SdkMemberTypeBase) HasTransitiveSdkMembers() bool {
return b.TransitiveSdkMembers
}
// Encapsulates the information about registered SdkMemberTypes.
type SdkMemberTypesRegistry struct {
// The list of types sorted by property name.

View File

@ -105,23 +105,23 @@ func (gf *generatedFile) build(pctx android.PackageContext, ctx android.BuilderC
// Collect all the members.
//
// The members are first grouped by type and then grouped by name. The order of
// the types is the order they are referenced in android.SdkMemberTypes. The
// names are in order in which the dependencies were added.
// the types is the order they are referenced in android.SdkMemberTypesRegistry.
// The names are in the order in which the dependencies were added.
func (s *sdk) collectMembers(ctx android.ModuleContext) []*sdkMember {
byType := make(map[android.SdkMemberType][]*sdkMember)
byName := make(map[string]*sdkMember)
ctx.VisitDirectDeps(func(m android.Module) {
tag := ctx.OtherModuleDependencyTag(m)
ctx.WalkDeps(func(child android.Module, parent android.Module) bool {
tag := ctx.OtherModuleDependencyTag(child)
if memberTag, ok := tag.(android.SdkMemberTypeDependencyTag); ok {
memberType := memberTag.SdkMemberType()
// Make sure that the resolved module is allowed in the member list property.
if !memberType.IsInstance(m) {
ctx.ModuleErrorf("module %q is not valid in property %s", ctx.OtherModuleName(m), memberType.SdkPropertyName())
if !memberType.IsInstance(child) {
ctx.ModuleErrorf("module %q is not valid in property %s", ctx.OtherModuleName(child), memberType.SdkPropertyName())
}
name := ctx.OtherModuleName(m)
name := ctx.OtherModuleName(child)
member := byName[name]
if member == nil {
@ -130,8 +130,14 @@ func (s *sdk) collectMembers(ctx android.ModuleContext) []*sdkMember {
byType[memberType] = append(byType[memberType], member)
}
member.variants = append(member.variants, m.(android.SdkAware))
member.variants = append(member.variants, child.(android.SdkAware))
// If the member type supports transitive sdk members then recurse down into
// its dependencies, otherwise exit traversal.
return memberType.HasTransitiveSdkMembers()
}
return false
})
var members []*sdkMember