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