Reimplement VisitDirectDeps[If] in on Context.walkdeps
VisitDirectDeps[If] need to know the parent in order to support
OtherModuleDependencyTag(), remove Context.visitDirectDeps[If] and
reimplement [Module]Context.VisitDirectDeps[If] using Context.walkdeps.
Change-Id: I2faac2d100d2a0ad2a4f1d8250997eed1a7ef6f0
Test: TestVisit
diff --git a/module_ctx.go b/module_ctx.go
index 9cb9cbb..845b0a0 100644
--- a/module_ctx.go
+++ b/module_ctx.go
@@ -155,11 +155,12 @@
var _ BaseModuleContext = (*baseModuleContext)(nil)
type baseModuleContext struct {
- context *Context
- config interface{}
- module *moduleInfo
- errs []error
- visiting depInfo
+ context *Context
+ config interface{}
+ module *moduleInfo
+ errs []error
+ visitingParent *moduleInfo
+ visitingDep depInfo
}
func (d *baseModuleContext) moduleInfo() *moduleInfo {
@@ -255,11 +256,11 @@
func (m *baseModuleContext) OtherModuleDependencyTag(logicModule Module) DependencyTag {
// fast path for calling OtherModuleDependencyTag from inside VisitDirectDeps
- if logicModule == m.visiting.module.logicModule {
- return m.visiting.tag
+ if logicModule == m.visitingDep.module.logicModule {
+ return m.visitingDep.tag
}
- for _, dep := range m.module.directDeps {
+ for _, dep := range m.visitingParent.directDeps {
if dep.module.logicModule == logicModule {
return dep.tag
}
@@ -272,46 +273,91 @@
defer func() {
if r := recover(); r != nil {
panic(newPanicErrorf(r, "VisitDirectDeps(%s, %s) for dependency %s",
- m.module, funcName(visit), m.visiting.module))
+ m.module, funcName(visit), m.visitingDep.module))
}
}()
+ m.visitingParent = m.module
+
for _, dep := range m.module.directDeps {
- m.visiting = dep
+ m.visitingDep = dep
visit(dep.module.logicModule)
}
- m.visiting = depInfo{}
+
+ m.visitingParent = nil
+ m.visitingDep = depInfo{}
}
func (m *baseModuleContext) VisitDirectDepsIf(pred func(Module) bool, visit func(Module)) {
defer func() {
if r := recover(); r != nil {
panic(newPanicErrorf(r, "VisitDirectDepsIf(%s, %s, %s) for dependency %s",
- m.module, funcName(pred), funcName(visit), m.visiting.module))
+ m.module, funcName(pred), funcName(visit), m.visitingDep.module))
}
}()
+ m.visitingParent = m.module
+
for _, dep := range m.module.directDeps {
- m.visiting = dep
+ m.visitingDep = dep
if pred(dep.module.logicModule) {
visit(dep.module.logicModule)
}
}
- m.visiting = depInfo{}
+
+ m.visitingParent = nil
+ m.visitingDep = depInfo{}
}
func (m *baseModuleContext) VisitDepsDepthFirst(visit func(Module)) {
- m.context.visitDepsDepthFirst(m.module, visit)
+ defer func() {
+ if r := recover(); r != nil {
+ panic(newPanicErrorf(r, "VisitDepsDepthFirst(%s, %s) for dependency %s",
+ m.module, funcName(visit), m.visitingDep.module))
+ }
+ }()
+
+ m.context.walkDeps(m.module, nil, func(dep depInfo, parent *moduleInfo) {
+ m.visitingParent = parent
+ m.visitingDep = dep
+ visit(dep.module.logicModule)
+ })
+
+ m.visitingParent = nil
+ m.visitingDep = depInfo{}
}
func (m *baseModuleContext) VisitDepsDepthFirstIf(pred func(Module) bool,
visit func(Module)) {
- m.context.visitDepsDepthFirstIf(m.module, pred, visit)
+ defer func() {
+ if r := recover(); r != nil {
+ panic(newPanicErrorf(r, "VisitDepsDepthFirstIf(%s, %s, %s) for dependency %s",
+ m.module, funcName(pred), funcName(visit), m.visitingDep.module))
+ }
+ }()
+
+ m.context.walkDeps(m.module, nil, func(dep depInfo, parent *moduleInfo) {
+ if pred(dep.module.logicModule) {
+ m.visitingParent = parent
+ m.visitingDep = dep
+ visit(dep.module.logicModule)
+ }
+ })
+
+ m.visitingParent = nil
+ m.visitingDep = depInfo{}
}
func (m *baseModuleContext) WalkDeps(visit func(Module, Module) bool) {
- m.context.walkDeps(m.module, visit)
+ m.context.walkDeps(m.module, func(dep depInfo, parent *moduleInfo) bool {
+ m.visitingParent = parent
+ m.visitingDep = dep
+ return visit(dep.module.logicModule, parent.logicModule)
+ }, nil)
+
+ m.visitingParent = nil
+ m.visitingDep = depInfo{}
}
func (m *moduleContext) ModuleSubDir() string {