Merge pull request #69 from colincross/depserrors
Don't rely on deps property position
diff --git a/context.go b/context.go
index adeea4a..e45c237 100644
--- a/context.go
+++ b/context.go
@@ -1147,9 +1147,9 @@
}}
}
-func (c *Context) addReverseDependency(module *moduleInfo, destName string) []error {
+func (c *Context) findReverseDependency(module *moduleInfo, destName string) (*moduleInfo, []error) {
if destName == module.properties.Name {
- return []error{&Error{
+ return nil, []error{&Error{
Err: fmt.Errorf("%q depends on itself", destName),
Pos: module.pos,
}}
@@ -1157,7 +1157,7 @@
destInfo, ok := c.moduleGroups[destName]
if !ok {
- return []error{&Error{
+ return nil, []error{&Error{
Err: fmt.Errorf("%q has a reverse dependency on undefined module %q",
module.properties.Name, destName),
Pos: module.pos,
@@ -1165,11 +1165,10 @@
}
if m := c.findMatchingVariant(module, destInfo); m != nil {
- m.directDeps = append(m.directDeps, module)
- return nil
+ return m, nil
}
- return []error{&Error{
+ return nil, []error{&Error{
Err: fmt.Errorf("reverse dependency %q of %q missing variant %q",
destName, module.properties.Name,
c.prettyPrintVariant(module.dependencyVariant)),
@@ -1543,6 +1542,8 @@
func (c *Context) runBottomUpMutator(config interface{},
name string, mutator BottomUpMutator) (errs []error) {
+ reverseDeps := make(map[*moduleInfo][]*moduleInfo)
+
for _, module := range c.modulesSorted {
newModules := make([]*moduleInfo, 0, 1)
@@ -1556,7 +1557,8 @@
config: config,
module: module,
},
- name: name,
+ name: name,
+ reverseDeps: reverseDeps,
}
mutator(mctx)
@@ -1582,6 +1584,11 @@
module.group.modules = spliceModules(module.group.modules, module, newModules)
}
+ for module, deps := range reverseDeps {
+ sort.Sort(moduleSorter(deps))
+ module.directDeps = append(module.directDeps, deps...)
+ }
+
errs = c.updateDependencies()
if len(errs) > 0 {
return errs
diff --git a/module_ctx.go b/module_ctx.go
index 5fd04d0..ce3cb8a 100644
--- a/module_ctx.go
+++ b/module_ctx.go
@@ -328,7 +328,8 @@
type mutatorContext struct {
baseModuleContext
- name string
+ name string
+ reverseDeps map[*moduleInfo][]*moduleInfo
}
type baseMutatorContext interface {
@@ -453,12 +454,18 @@
// Add a dependency from the destination to the given module.
// Does not affect the ordering of the current mutator pass, but will be ordered
-// correctly for all future mutator passes.
+// correctly for all future mutator passes. All reverse dependencies for a destination module are
+// collected until the end of the mutator pass, sorted by name, and then appended to the destination
+// module's dependency list.
func (mctx *mutatorContext) AddReverseDependency(module Module, destName string) {
- errs := mctx.context.addReverseDependency(mctx.module, destName)
+ destModule, errs := mctx.context.findReverseDependency(mctx.context.moduleInfo[module], destName)
if len(errs) > 0 {
mctx.errs = append(mctx.errs, errs...)
+ return
}
+
+ mctx.reverseDeps[destModule] = append(mctx.reverseDeps[destModule],
+ mctx.context.moduleInfo[module])
}
// AddVariationDependencies adds deps as dependencies of the current module, but uses the variations