Merge "Add support for transitive sdk members"
This commit is contained in:
@@ -264,6 +264,13 @@ type SdkMemberType interface {
|
|||||||
// True if the member type supports the sdk/sdk_snapshot, false otherwise.
|
// True if the member type supports the sdk/sdk_snapshot, false otherwise.
|
||||||
UsableWithSdkAndSdkSnapshot() bool
|
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
|
// Add dependencies from the SDK module to all the variants the member
|
||||||
// contributes to the SDK. The exact set of variants required is determined
|
// 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
|
// by the SDK and its properties. The dependencies must be added with the
|
||||||
@@ -293,6 +300,7 @@ type SdkMemberType interface {
|
|||||||
type SdkMemberTypeBase struct {
|
type SdkMemberTypeBase struct {
|
||||||
PropertyName string
|
PropertyName string
|
||||||
SupportsSdk bool
|
SupportsSdk bool
|
||||||
|
TransitiveSdkMembers bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *SdkMemberTypeBase) SdkPropertyName() string {
|
func (b *SdkMemberTypeBase) SdkPropertyName() string {
|
||||||
@@ -303,6 +311,10 @@ func (b *SdkMemberTypeBase) UsableWithSdkAndSdkSnapshot() bool {
|
|||||||
return b.SupportsSdk
|
return b.SupportsSdk
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *SdkMemberTypeBase) HasTransitiveSdkMembers() bool {
|
||||||
|
return b.TransitiveSdkMembers
|
||||||
|
}
|
||||||
|
|
||||||
// Encapsulates the information about registered SdkMemberTypes.
|
// Encapsulates the information about registered SdkMemberTypes.
|
||||||
type SdkMemberTypesRegistry struct {
|
type SdkMemberTypesRegistry struct {
|
||||||
// The list of types sorted by property name.
|
// The list of types sorted by property name.
|
||||||
|
@@ -105,23 +105,23 @@ func (gf *generatedFile) build(pctx android.PackageContext, ctx android.BuilderC
|
|||||||
// Collect all the members.
|
// Collect all the members.
|
||||||
//
|
//
|
||||||
// The members are first grouped by type and then grouped by name. The order of
|
// 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
|
// the types is the order they are referenced in android.SdkMemberTypesRegistry.
|
||||||
// names are in order in which the dependencies were added.
|
// The names are in the order in which the dependencies were added.
|
||||||
func (s *sdk) collectMembers(ctx android.ModuleContext) []*sdkMember {
|
func (s *sdk) collectMembers(ctx android.ModuleContext) []*sdkMember {
|
||||||
byType := make(map[android.SdkMemberType][]*sdkMember)
|
byType := make(map[android.SdkMemberType][]*sdkMember)
|
||||||
byName := make(map[string]*sdkMember)
|
byName := make(map[string]*sdkMember)
|
||||||
|
|
||||||
ctx.VisitDirectDeps(func(m android.Module) {
|
ctx.WalkDeps(func(child android.Module, parent android.Module) bool {
|
||||||
tag := ctx.OtherModuleDependencyTag(m)
|
tag := ctx.OtherModuleDependencyTag(child)
|
||||||
if memberTag, ok := tag.(android.SdkMemberTypeDependencyTag); ok {
|
if memberTag, ok := tag.(android.SdkMemberTypeDependencyTag); ok {
|
||||||
memberType := memberTag.SdkMemberType()
|
memberType := memberTag.SdkMemberType()
|
||||||
|
|
||||||
// Make sure that the resolved module is allowed in the member list property.
|
// Make sure that the resolved module is allowed in the member list property.
|
||||||
if !memberType.IsInstance(m) {
|
if !memberType.IsInstance(child) {
|
||||||
ctx.ModuleErrorf("module %q is not valid in property %s", ctx.OtherModuleName(m), memberType.SdkPropertyName())
|
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]
|
member := byName[name]
|
||||||
if member == nil {
|
if member == nil {
|
||||||
@@ -130,8 +130,14 @@ func (s *sdk) collectMembers(ctx android.ModuleContext) []*sdkMember {
|
|||||||
byType[memberType] = append(byType[memberType], member)
|
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
|
var members []*sdkMember
|
||||||
|
Reference in New Issue
Block a user