Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3bbf9276 authored by Yu Liu's avatar Yu Liu Committed by Gerrit Code Review
Browse files

Merge "Add ModuleProxy that should be used when visiting deps." into main

parents 45416899 dd9ccb42
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -71,6 +71,7 @@ bootstrap_go_package {
        "module.go",
        "module_context.go",
        "module_info_json.go",
        "module_proxy.go",
        "mutator.go",
        "namespace.go",
        "neverallow.go",
+58 −2
Original line number Diff line number Diff line
@@ -33,6 +33,8 @@ type BaseModuleContext interface {

	blueprintBaseModuleContext() blueprint.BaseModuleContext

	EqualModules(m1, m2 Module) bool

	// OtherModuleName returns the name of another Module.  See BaseModuleContext.ModuleName for more information.
	// It is intended for use inside the visit functions of Visit* and WalkDeps.
	OtherModuleName(m blueprint.Module) string
@@ -130,6 +132,14 @@ type BaseModuleContext interface {
	// function, it may be invalidated by future mutators.
	VisitDirectDepsAllowDisabled(visit func(Module))

	// VisitDirectDepsProxyAllowDisabled calls visit for each direct dependency.  If there are
	// multiple direct dependencies on the same module visit will be called multiple times on
	// that module and OtherModuleDependencyTag will return a different tag for each.
	//
	// The Module passed to the visit function should not be retained outside of the visit function, it may be
	// invalidated by future mutators.
	VisitDirectDepsProxyAllowDisabled(visit func(proxy Module))

	VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module))

	// VisitDirectDepsIf calls pred for each direct dependency, and if pred returns true calls visit.  If there are
@@ -155,6 +165,16 @@ type BaseModuleContext interface {
	// invalidated by future mutators.
	WalkDeps(visit func(child, parent Module) bool)

	// WalkDeps calls visit for each transitive dependency, traversing the dependency tree in top down order.  visit may
	// be called multiple times for the same (child, parent) pair if there are multiple direct dependencies between the
	// child and parent with different tags.  OtherModuleDependencyTag will return the tag for the currently visited
	// (child, parent) pair.  If visit returns false WalkDeps will not continue recursing down to child.  It skips
	// any dependencies that are not an android.Module.
	//
	// The Modules passed to the visit function should not be retained outside of the visit function, they may be
	// invalidated by future mutators.
	WalkDepsProxy(visit func(child, parent Module) bool)

	// GetWalkPath is supposed to be called in visit function passed in WalkDeps()
	// and returns a top-down dependency path from a start module to current child module.
	GetWalkPath() []Module
@@ -214,15 +234,26 @@ type baseModuleContext struct {

}

func getWrappedModule(module blueprint.Module) blueprint.Module {
	if mp, isProxy := module.(ModuleProxy); isProxy {
		return mp.module
	}
	return module
}

func (b *baseModuleContext) EqualModules(m1, m2 Module) bool {
	return b.bp.EqualModules(getWrappedModule(m1), getWrappedModule(m2))
}

func (b *baseModuleContext) OtherModuleName(m blueprint.Module) string {
	return b.bp.OtherModuleName(m)
	return b.bp.OtherModuleName(getWrappedModule(m))
}
func (b *baseModuleContext) OtherModuleDir(m blueprint.Module) string { return b.bp.OtherModuleDir(m) }
func (b *baseModuleContext) OtherModuleErrorf(m blueprint.Module, fmt string, args ...interface{}) {
	b.bp.OtherModuleErrorf(m, fmt, args...)
}
func (b *baseModuleContext) OtherModuleDependencyTag(m blueprint.Module) blueprint.DependencyTag {
	return b.bp.OtherModuleDependencyTag(m)
	return b.bp.OtherModuleDependencyTag(getWrappedModule(m))
}
func (b *baseModuleContext) OtherModuleExists(name string) bool { return b.bp.OtherModuleExists(name) }
func (b *baseModuleContext) OtherModuleDependencyVariantExists(variations []blueprint.Variation, name string) bool {
@@ -395,6 +426,14 @@ func (b *baseModuleContext) VisitDirectDepsAllowDisabled(visit func(Module)) {
	})
}

func (b *baseModuleContext) VisitDirectDepsProxyAllowDisabled(visit func(proxy Module)) {
	b.bp.VisitDirectDepsProxy(func(module blueprint.ModuleProxy) {
		visit(ModuleProxy{
			module: module,
		})
	})
}

func (b *baseModuleContext) VisitDirectDepsWithTag(tag blueprint.DependencyTag, visit func(Module)) {
	b.bp.VisitDirectDeps(func(module blueprint.Module) {
		if b.bp.OtherModuleDependencyTag(module) == tag {
@@ -466,6 +505,23 @@ func (b *baseModuleContext) WalkDeps(visit func(Module, Module) bool) {
	})
}

func (b *baseModuleContext) WalkDepsProxy(visit func(Module, Module) bool) {
	b.walkPath = []Module{ModuleProxy{blueprint.CreateModuleProxy(b.Module())}}
	b.tagPath = []blueprint.DependencyTag{}
	b.bp.WalkDepsProxy(func(child, parent blueprint.ModuleProxy) bool {
		childAndroidModule := ModuleProxy{child}
		parentAndroidModule := ModuleProxy{parent}
		// record walkPath before visit
		for b.walkPath[len(b.walkPath)-1] != parentAndroidModule {
			b.walkPath = b.walkPath[0 : len(b.walkPath)-1]
			b.tagPath = b.tagPath[0 : len(b.tagPath)-1]
		}
		b.walkPath = append(b.walkPath, childAndroidModule)
		b.tagPath = append(b.tagPath, b.OtherModuleDependencyTag(childAndroidModule))
		return visit(childAndroidModule, parentAndroidModule)
	})
}

func (b *baseModuleContext) GetWalkPath() []Module {
	return b.walkPath
}
+37 −0
Original line number Diff line number Diff line
@@ -1803,6 +1803,26 @@ type FinalModuleBuildTargetsInfo struct {

var FinalModuleBuildTargetsProvider = blueprint.NewProvider[FinalModuleBuildTargetsInfo]()

type CommonPropertiesProviderData struct {
	Enabled bool
	// Whether the module has been replaced by a prebuilt
	ReplacedByPrebuilt bool
}

var CommonPropertiesProviderKey = blueprint.NewProvider[CommonPropertiesProviderData]()

type PrebuiltModuleProviderData struct {
	// Empty for now
}

var PrebuiltModuleProviderKey = blueprint.NewProvider[PrebuiltModuleProviderData]()

type HostToolProviderData struct {
	HostToolPath OptionalPath
}

var HostToolProviderKey = blueprint.NewProvider[HostToolProviderData]()

func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) {
	ctx := &moduleContext{
		module:            m.module,
@@ -2048,6 +2068,23 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext)
		})
	}
	buildComplianceMetadataProvider(ctx, m)

	commonData := CommonPropertiesProviderData{
		ReplacedByPrebuilt: m.commonProperties.ReplacedByPrebuilt,
	}
	if m.commonProperties.ForcedDisabled {
		commonData.Enabled = false
	} else {
		commonData.Enabled = m.commonProperties.Enabled.GetOrDefault(m.ConfigurableEvaluator(ctx), !m.Os().DefaultDisabled)
	}
	SetProvider(ctx, CommonPropertiesProviderKey, commonData)
	if p, ok := m.module.(PrebuiltInterface); ok && p.Prebuilt() != nil {
		SetProvider(ctx, PrebuiltModuleProviderKey, PrebuiltModuleProviderData{})
	}
	if h, ok := m.module.(HostToolProvider); ok {
		SetProvider(ctx, HostToolProviderKey, HostToolProviderData{
			HostToolPath: h.HostToolPath()})
	}
}

func SetJarJarPrefixHandler(handler func(ModuleContext)) {
+203 −0
Original line number Diff line number Diff line
package android

import (
	"github.com/google/blueprint"
	"github.com/google/blueprint/proptools"
)

type ModuleProxy struct {
	module blueprint.ModuleProxy
}

func (m ModuleProxy) Name() string {
	return m.module.Name()
}

func (m ModuleProxy) GenerateBuildActions(context blueprint.ModuleContext) {
	m.module.GenerateBuildActions(context)
}

func (m ModuleProxy) GenerateAndroidBuildActions(context ModuleContext) {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) ComponentDepsMutator(ctx BottomUpMutatorContext) {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) DepsMutator(context BottomUpMutatorContext) {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) base() *ModuleBase {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) Disable() {

	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) Enabled(ctx ConfigurableEvaluatorContext) bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) Target() Target {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) MultiTargets() []Target {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) ImageVariation() blueprint.Variation {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) Owner() string {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInData() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInTestcases() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInSanitizerDir() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInRamdisk() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInVendorRamdisk() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInDebugRamdisk() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInRecovery() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInRoot() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInOdm() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInProduct() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInVendor() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInSystemExt() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallForceOS() (*OsType, *ArchType) {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) PartitionTag(d DeviceConfig) string {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) HideFromMake() {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) IsHideFromMake() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) IsSkipInstall() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) MakeUninstallable() {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) ReplacedByPrebuilt() {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) IsReplacedByPrebuilt() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) ExportedToMake() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) EffectiveLicenseKinds() []string {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) EffectiveLicenseFiles() Paths {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) AddProperties(props ...interface{}) {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) GetProperties() []interface{} {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) BuildParamsForTests() []BuildParams {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) VariablesForTests() map[string]string {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) String() string {
	return m.module.Name()
}

func (m ModuleProxy) qualifiedModuleId(ctx BaseModuleContext) qualifiedModuleName {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) visibilityProperties() []visibilityProperty {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) RequiredModuleNames(ctx ConfigurableEvaluatorContext) []string {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) HostRequiredModuleNames() []string {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) TargetRequiredModuleNames() []string {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) VintfFragmentModuleNames(ctx ConfigurableEvaluatorContext) []string {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) ConfigurableEvaluator(ctx ConfigurableEvaluatorContext) proptools.ConfigurableEvaluator {
	panic("method is not implemented on ModuleProxy")
}
+1 −1
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ var _ OtherModuleProviderContext = (*TestContext)(nil)
// OtherModuleProviderContext is a helper interface that accepts ModuleContext, BottomUpMutatorContext, or
// TopDownMutatorContext.
func OtherModuleProvider[K any](ctx OtherModuleProviderContext, module blueprint.Module, provider blueprint.ProviderKey[K]) (K, bool) {
	value, ok := ctx.otherModuleProvider(module, provider)
	value, ok := ctx.otherModuleProvider(getWrappedModule(module), provider)
	if !ok {
		var k K
		return k, false