From b5b403abcc2f3a3fed2ef154f2aeffc479cfcfc2 Mon Sep 17 00:00:00 2001
From: Patrick Walton <pcwalton@mimiga.net>
Date: Sat, 21 Dec 2013 14:05:26 -0800
Subject: [PATCH] librustc: De-`@mut` `Module::external_module_children`

---
 src/librustc/middle/resolve.rs | 62 ++++++++++++++++++++++++----------
 1 file changed, 45 insertions(+), 17 deletions(-)

diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs
index f0c9ccf5973..d9843189585 100644
--- a/src/librustc/middle/resolve.rs
+++ b/src/librustc/middle/resolve.rs
@@ -425,7 +425,7 @@ struct Module {
 
     // The external module children of this node that were declared with
     // `extern mod`.
-    external_module_children: @mut HashMap<Name, @Module>,
+    external_module_children: RefCell<HashMap<Name, @Module>>,
 
     // The anonymous children of this node. Anonymous children are pseudo-
     // modules that are implicitly created around items contained within
@@ -472,7 +472,7 @@ impl Module {
             is_public: is_public,
             children: @mut HashMap::new(),
             imports: @mut ~[],
-            external_module_children: @mut HashMap::new(),
+            external_module_children: RefCell::new(HashMap::new()),
             anonymous_children: @mut HashMap::new(),
             import_resolutions: @mut HashMap::new(),
             glob_count: Cell::new(0),
@@ -1506,9 +1506,13 @@ impl Resolver {
                                                           false,
                                                           true);
 
-                        parent.external_module_children.insert(
-                            name.name,
-                            external_module);
+                        {
+                            let mut external_module_children =
+                                parent.external_module_children.borrow_mut();
+                            external_module_children.get().insert(
+                                name.name,
+                                external_module);
+                        }
 
                         self.build_reduced_graph_for_external_crate(
                             external_module);
@@ -2352,13 +2356,18 @@ impl Resolver {
         match type_result {
             BoundResult(..) => {}
             _ => {
-                match containing_module.external_module_children
-                                       .find(&source.name) {
+                let module_opt = {
+                    let mut external_module_children =
+                        containing_module.external_module_children
+                                         .borrow_mut();
+                    external_module_children.get().find_copy(&source.name)
+                };
+                match module_opt {
                     None => {} // Continue.
                     Some(module) => {
                         let name_bindings =
                             @mut Resolver::create_name_bindings_from_module(
-                                *module);
+                                module);
                         type_result = BoundResult(containing_module,
                                                   name_bindings);
                         used_public = true;
@@ -2565,10 +2574,14 @@ impl Resolver {
         }
 
         // Add external module children from the containing module.
-        for (&name, module) in containing_module.external_module_children.iter() {
-            let name_bindings =
-                @mut Resolver::create_name_bindings_from_module(*module);
-            merge_import_resolution(name, name_bindings);
+        {
+            let external_module_children =
+                containing_module.external_module_children.borrow();
+            for (&name, module) in external_module_children.get().iter() {
+                let name_bindings =
+                    @mut Resolver::create_name_bindings_from_module(*module);
+                merge_import_resolution(name, name_bindings);
+            }
         }
 
         // Record the destination of this import
@@ -2861,12 +2874,17 @@ impl Resolver {
 
         // Search for external modules.
         if namespace == TypeNS {
-            match module_.external_module_children.find(&name.name) {
+            let module_opt = {
+                let external_module_children =
+                    module_.external_module_children.borrow();
+                external_module_children.get().find_copy(&name.name)
+            };
+            match module_opt {
                 None => {}
                 Some(module) => {
                     let name_bindings =
                         @mut Resolver::create_name_bindings_from_module(
-                            *module);
+                            module);
                     debug!("lower name bindings succeeded");
                     return Success((Target::new(module_, name_bindings), false));
                 }
@@ -3133,12 +3151,17 @@ impl Resolver {
 
         // Finally, search through external children.
         if namespace == TypeNS {
-            match module_.external_module_children.find(&name.name) {
+            let module_opt = {
+                let external_module_children =
+                    module_.external_module_children.borrow();
+                external_module_children.get().find_copy(&name.name)
+            };
+            match module_opt {
                 None => {}
                 Some(module) => {
                     let name_bindings =
                         @mut Resolver::create_name_bindings_from_module(
-                            *module);
+                            module);
                     return Success((Target::new(module_, name_bindings), false));
                 }
             }
@@ -4664,7 +4687,12 @@ impl Resolver {
 
         // Finally, search through external children.
         if namespace == TypeNS {
-            match containing_module.external_module_children.find(&name.name) {
+            let module_opt = {
+                let external_module_children =
+                    containing_module.external_module_children.borrow();
+                external_module_children.get().find_copy(&name.name)
+            };
+            match module_opt {
                 None => {}
                 Some(module) => {
                     match module.def_id.get() {