]> git.lizzy.rs Git - rust.git/blobdiff - src/librustc/middle/resolve.rs
use TotalEq for HashMap
[rust.git] / src / librustc / middle / resolve.rs
index 975daff56f1193dee7bf27829dc9e1814661b7b1..d86e05395b4c8b5a218ed6dd9ac948fb05c0542b 100644 (file)
 use middle::lang_items::LanguageItems;
 use middle::lint::{UnnecessaryQualification, UnusedImports};
 use middle::pat_util::pat_bindings;
+use util::nodemap::{NodeMap, DefIdSet};
 
 use syntax::ast::*;
 use syntax::ast;
-use syntax::ast_util::{def_id_of_def, local_def, mtwt_resolve};
+use syntax::ast_util::{def_id_of_def, local_def};
 use syntax::ast_util::{path_to_ident, walk_pat, trait_method_to_ty_method};
+use syntax::ext::mtwt;
 use syntax::parse::token::special_idents;
 use syntax::parse::token;
 use syntax::print::pprust::path_to_str;
 use syntax::codemap::{Span, DUMMY_SP, Pos};
-use syntax::opt_vec::OptVec;
+use syntax::owned_slice::OwnedSlice;
 use syntax::visit;
 use syntax::visit::Visitor;
 
@@ -35,7 +37,7 @@
 use collections::{HashMap, HashSet};
 
 // Definition mapping
-pub type DefMap = @RefCell<HashMap<NodeId,Def>>;
+pub type DefMap = @RefCell<NodeMap<Def>>;
 
 struct binding_info {
     span: Span,
@@ -46,11 +48,11 @@ struct binding_info {
 type BindingMap = HashMap<Name,binding_info>;
 
 // Trait method resolution
-pub type TraitMap = HashMap<NodeId,@RefCell<~[DefId]>>;
+pub type TraitMap = NodeMap<Vec<DefId> >;
 
 // This is the replacement export map. It maps a module to all of the exports
 // within.
-pub type ExportMap2 = @RefCell<HashMap<NodeId, ~[Export2]>>;
+pub type ExportMap2 = @RefCell<NodeMap<Vec<Export2> >>;
 
 pub struct Export2 {
     name: ~str,        // The name of the target.
@@ -59,10 +61,10 @@ pub struct Export2 {
 
 // This set contains all exported definitions from external crates. The set does
 // not contain any entries from local crates.
-pub type ExternalExports = HashSet<DefId>;
+pub type ExternalExports = DefIdSet;
 
 // FIXME: dox
-pub type LastPrivateMap = HashMap<NodeId, LastPrivate>;
+pub type LastPrivateMap = NodeMap<LastPrivate>;
 
 pub enum LastPrivate {
     LastMod(PrivateDep),
@@ -105,7 +107,7 @@ enum PatternBindingMode {
     ArgumentIrrefutableMode,
 }
 
-#[deriving(Eq, Hash)]
+#[deriving(Eq, TotalEq, Hash)]
 enum Namespace {
     TypeNS,
     ValueNS
@@ -150,7 +152,7 @@ enum NameDefinition {
     ImportNameDefinition(Def, LastPrivate) //< The name identifies an import.
 }
 
-impl Visitor<()> for Resolver {
+impl<'a> Visitor<()> for Resolver<'a> {
     fn visit_item(&mut self, item: &Item, _: ()) {
         self.resolve_item(item);
     }
@@ -317,7 +319,7 @@ fn new(kind: RibKind) -> Rib {
 
 /// One import directive.
 struct ImportDirective {
-    module_path: ~[Ident],
+    module_path: Vec<Ident> ,
     subclass: @ImportDirectiveSubclass,
     span: Span,
     id: NodeId,
@@ -325,7 +327,7 @@ struct ImportDirective {
 }
 
 impl ImportDirective {
-    fn new(module_path: ~[Ident],
+    fn new(module_path: Vec<Ident> ,
            subclass: @ImportDirectiveSubclass,
            span: Span,
            id: NodeId,
@@ -436,7 +438,7 @@ struct Module {
     is_public: bool,
 
     children: RefCell<HashMap<Name, @NameBindings>>,
-    imports: RefCell<~[@ImportDirective]>,
+    imports: RefCell<Vec<@ImportDirective> >,
 
     // The external module children of this node that were declared with
     // `extern crate`.
@@ -456,7 +458,7 @@ struct Module {
     //
     // There will be an anonymous module created around `g` with the ID of the
     // entry block for `f`.
-    anonymous_children: RefCell<HashMap<NodeId,@Module>>,
+    anonymous_children: RefCell<NodeMap<@Module>>,
 
     // The status of resolving each import in this module.
     import_resolutions: RefCell<HashMap<Name, @ImportResolution>>,
@@ -486,9 +488,9 @@ fn new(parent_link: ParentLink,
             kind: Cell::new(kind),
             is_public: is_public,
             children: RefCell::new(HashMap::new()),
-            imports: RefCell::new(~[]),
+            imports: RefCell::new(Vec::new()),
             external_module_children: RefCell::new(HashMap::new()),
-            anonymous_children: RefCell::new(HashMap::new()),
+            anonymous_children: RefCell::new(NodeMap::new()),
             import_resolutions: RefCell::new(HashMap::new()),
             glob_count: Cell::new(0),
             resolved_import_count: Cell::new(0),
@@ -497,8 +499,7 @@ fn new(parent_link: ParentLink,
     }
 
     fn all_imports_resolved(&self) -> bool {
-        let mut imports = self.imports.borrow_mut();
-        return imports.get().len() == self.resolved_import_count.get();
+        self.imports.borrow().len() == self.resolved_import_count.get()
     }
 }
 
@@ -639,8 +640,7 @@ fn define_value(&self, def: Def, sp: Span, is_public: bool) {
 
     /// Returns the module node if applicable.
     fn get_module_if_available(&self) -> Option<@Module> {
-        let type_def = self.type_def.borrow();
-        match *type_def.get() {
+        match *self.type_def.borrow() {
             Some(ref type_def) => (*type_def).module_def,
             None => None
         }
@@ -784,9 +784,9 @@ fn namespace_error_to_str(ns: NamespaceError) -> &'static str {
     }
 }
 
-fn Resolver(session: Session,
-            lang_items: @LanguageItems,
-            crate_span: Span) -> Resolver {
+fn Resolver<'a>(session: &'a Session,
+                lang_items: @LanguageItems,
+                crate_span: Span) -> Resolver<'a> {
     let graph_root = @NameBindings();
 
     graph_root.define_module(NoParentLink,
@@ -799,7 +799,7 @@ fn Resolver(session: Session,
     let current_module = graph_root.get_module();
 
     let this = Resolver {
-        session: @session,
+        session: session,
         lang_items: lang_items,
 
         // The outermost module has def ID 0; this is not reflected in the
@@ -813,9 +813,9 @@ fn Resolver(session: Session,
         unresolved_imports: 0,
 
         current_module: current_module,
-        value_ribs: @RefCell::new(~[]),
-        type_ribs: @RefCell::new(~[]),
-        label_ribs: @RefCell::new(~[]),
+        value_ribs: @RefCell::new(Vec::new()),
+        type_ribs: @RefCell::new(Vec::new()),
+        label_ribs: @RefCell::new(Vec::new()),
 
         current_trait_refs: None,
 
@@ -824,14 +824,14 @@ fn Resolver(session: Session,
 
         primitive_type_table: @PrimitiveTypeTable(),
 
-        namespaces: ~[ TypeNS, ValueNS ],
+        namespaces: vec!(TypeNS, ValueNS),
 
-        def_map: @RefCell::new(HashMap::new()),
-        export_map2: @RefCell::new(HashMap::new()),
-        trait_map: HashMap::new(),
+        def_map: @RefCell::new(NodeMap::new()),
+        export_map2: @RefCell::new(NodeMap::new()),
+        trait_map: NodeMap::new(),
         used_imports: HashSet::new(),
-        external_exports: HashSet::new(),
-        last_private: HashMap::new(),
+        external_exports: DefIdSet::new(),
+        last_private: NodeMap::new(),
 
         emit_errors: true,
     };
@@ -840,8 +840,8 @@ fn Resolver(session: Session,
 }
 
 /// The main resolver class.
-struct Resolver {
-    session: @Session,
+struct Resolver<'a> {
+    session: &'a Session,
     lang_items: @LanguageItems,
 
     graph_root: @NameBindings,
@@ -857,16 +857,16 @@ struct Resolver {
 
     // The current set of local scopes, for values.
     // FIXME #4948: Reuse ribs to avoid allocation.
-    value_ribs: @RefCell<~[@Rib]>,
+    value_ribs: @RefCell<Vec<@Rib> >,
 
     // The current set of local scopes, for types.
-    type_ribs: @RefCell<~[@Rib]>,
+    type_ribs: @RefCell<Vec<@Rib> >,
 
     // The current set of local scopes, for labels.
-    label_ribs: @RefCell<~[@Rib]>,
+    label_ribs: @RefCell<Vec<@Rib> >,
 
     // The trait that the current context can refer to.
-    current_trait_refs: Option<~[DefId]>,
+    current_trait_refs: Option<Vec<DefId> >,
 
     // The ident for the keyword "self".
     self_ident: Ident,
@@ -877,7 +877,7 @@ struct Resolver {
     primitive_type_table: @PrimitiveTypeTable,
 
     // The four namespaces.
-    namespaces: ~[Namespace],
+    namespaces: Vec<Namespace> ,
 
     def_map: DefMap,
     export_map2: ExportMap2,
@@ -893,11 +893,11 @@ struct Resolver {
     used_imports: HashSet<(NodeId, Namespace)>,
 }
 
-struct BuildReducedGraphVisitor<'a> {
-    resolver: &'a mut Resolver,
+struct BuildReducedGraphVisitor<'a, 'b> {
+    resolver: &'a mut Resolver<'b>,
 }
 
-impl<'a> Visitor<ReducedGraphParent> for BuildReducedGraphVisitor<'a> {
+impl<'a, 'b> Visitor<ReducedGraphParent> for BuildReducedGraphVisitor<'a, 'b> {
 
     fn visit_item(&mut self, item: &Item, context: ReducedGraphParent) {
         let p = self.resolver.build_reduced_graph_for_item(item, context);
@@ -925,16 +925,16 @@ fn visit_block(&mut self, block: &Block, context: ReducedGraphParent) {
 
 }
 
-struct UnusedImportCheckVisitor<'a> { resolver: &'a mut Resolver }
+struct UnusedImportCheckVisitor<'a, 'b> { resolver: &'a mut Resolver<'b> }
 
-impl<'a> Visitor<()> for UnusedImportCheckVisitor<'a> {
+impl<'a, 'b> Visitor<()> for UnusedImportCheckVisitor<'a, 'b> {
     fn visit_view_item(&mut self, vi: &ViewItem, _: ()) {
         self.resolver.check_for_item_unused_imports(vi);
         visit::walk_view_item(self, vi, ());
     }
 }
 
-impl Resolver {
+impl<'a> Resolver<'a> {
     /// The main name resolution procedure.
     fn resolve(&mut self, krate: &ast::Crate) {
         self.build_reduced_graph(krate);
@@ -1009,15 +1009,11 @@ fn add_child(&mut self,
 
         // Add or reuse the child.
         let new_parent = ModuleReducedGraphParent(module_);
-        let child_opt = {
-            let children = module_.children.borrow();
-            children.get().find_copy(&name.name)
-        };
+        let child_opt = module_.children.borrow().find_copy(&name.name);
         match child_opt {
             None => {
                 let child = @NameBindings();
-                let mut children = module_.children.borrow_mut();
-                children.get().insert(name.name, child);
+                module_.children.borrow_mut().insert(name.name, child);
                 return (child, new_parent);
             }
             Some(child) => {
@@ -1256,11 +1252,9 @@ fn build_reduced_graph_for_item(&mut self,
                     TyPath(ref path, _, _) if path.segments.len() == 1 => {
                         let name = path_to_ident(path);
 
-                        let existing_parent_opt = {
-                            let children = parent.module().children.borrow();
-                            children.get().find_copy(&name.name)
-                        };
-                        let new_parent = match existing_parent_opt {
+                        let parent_opt = parent.module().children.borrow()
+                                               .find_copy(&name.name);
+                        let new_parent = match parent_opt {
                             // It already exists
                             Some(child) if child.get_module_if_available()
                                                 .is_some() &&
@@ -1391,10 +1385,10 @@ fn build_reduced_graph_for_item(&mut self,
                 let def_id = local_def(item.id);
                 for (name, _) in method_names.iter() {
                     let mut method_map = self.method_map.borrow_mut();
-                    if !method_map.get().contains_key(name) {
-                        method_map.get().insert(*name, HashSet::new());
+                    if !method_map.contains_key(name) {
+                        method_map.insert(*name, HashSet::new());
                     }
-                    match method_map.get().find_mut(name) {
+                    match method_map.find_mut(name) {
                         Some(s) => { s.insert(def_id); },
                         _ => fail!("can't happen"),
                     }
@@ -1450,7 +1444,7 @@ fn build_reduced_graph_for_view_item(&mut self, view_item: &ViewItem,
                     // globs and lists, the path is found directly in the AST;
                     // for simple paths we have to munge the path a little.
 
-                    let mut module_path = ~[];
+                    let mut module_path = Vec::new();
                     match view_path.node {
                         ViewPathSimple(_, ref full_path, _) => {
                             let path_len = full_path.segments.len();
@@ -1514,7 +1508,7 @@ fn build_reduced_graph_for_view_item(&mut self, view_item: &ViewItem,
                 }
             }
 
-            ViewItemExternMod(name, _, node_id) => {
+            ViewItemExternCrate(name, _, node_id) => {
                 // n.b. we don't need to look at the path option here, because cstore already did
                 match self.session.cstore.find_extern_mod_stmt_cnum(node_id) {
                     Some(crate_id) => {
@@ -1528,13 +1522,9 @@ fn build_reduced_graph_for_view_item(&mut self, view_item: &ViewItem,
                                                           false,
                                                           true);
 
-                        {
-                            let mut external_module_children =
-                                parent.module().external_module_children.borrow_mut();
-                            external_module_children.get().insert(
-                                name.name,
-                                external_module);
-                        }
+                        parent.module().external_module_children
+                              .borrow_mut().insert(name.name,
+                                                   external_module);
 
                         self.build_reduced_graph_for_external_crate(
                             external_module);
@@ -1597,12 +1587,9 @@ fn build_reduced_graph_for_block(&mut self,
                 AnonymousModuleKind,
                 false,
                 false);
-            {
-                let mut anonymous_children = parent_module.anonymous_children
-                                                          .borrow_mut();
-                anonymous_children.get().insert(block_id, new_module);
-                ModuleReducedGraphParent(new_module)
-            }
+            parent_module.anonymous_children.borrow_mut()
+                         .insert(block_id, new_module);
+            ModuleReducedGraphParent(new_module)
         } else {
             parent
         }
@@ -1687,11 +1674,11 @@ fn handle_external_def(&mut self,
               // to the trait info.
 
               let method_def_ids =
-                csearch::get_trait_method_def_ids(self.session.cstore, def_id);
+                csearch::get_trait_method_def_ids(&self.session.cstore, def_id);
               let mut interned_method_names = HashSet::new();
               for &method_def_id in method_def_ids.iter() {
                   let (method_name, explicit_self) =
-                      csearch::get_method_name_and_explicit_self(self.session.cstore,
+                      csearch::get_method_name_and_explicit_self(&self.session.cstore,
                                                                  method_def_id);
 
                   debug!("(building reduced graph for \
@@ -1709,10 +1696,10 @@ trait method '{}'",
               }
               for name in interned_method_names.iter() {
                   let mut method_map = self.method_map.borrow_mut();
-                  if !method_map.get().contains_key(name) {
-                      method_map.get().insert(*name, HashSet::new());
+                  if !method_map.contains_key(name) {
+                      method_map.insert(*name, HashSet::new());
                   }
-                  match method_map.get().find_mut(name) {
+                  match method_map.find_mut(name) {
                       Some(s) => { s.insert(def_id); },
                       _ => fail!("can't happen"),
                   }
@@ -1740,7 +1727,7 @@ trait method '{}'",
                     crate) building type and value for {}",
                    final_ident);
             child_name_bindings.define_type(def, DUMMY_SP, is_public);
-            if csearch::get_struct_fields(self.session.cstore, def_id).len() == 0 {
+            if csearch::get_struct_fields(&self.session.cstore, def_id).len() == 0 {
                 child_name_bindings.define_value(def, DUMMY_SP, is_public);
             }
             self.structs.insert(def_id);
@@ -1772,7 +1759,7 @@ fn build_reduced_graph_for_external_crate_def(&mut self,
                     DefForeignMod(def_id) => {
                         // Foreign modules have no names. Recur and populate
                         // eagerly.
-                        csearch::each_child_of_item(self.session.cstore,
+                        csearch::each_child_of_item(&self.session.cstore,
                                                     def_id,
                                                     |def_like,
                                                      child_ident,
@@ -1802,11 +1789,11 @@ fn build_reduced_graph_for_external_crate_def(&mut self,
             }
             DlImpl(def) => {
                 // We only process static methods of impls here.
-                match csearch::get_type_name_if_impl(self.session.cstore, def) {
+                match csearch::get_type_name_if_impl(&self.session.cstore, def) {
                     None => {}
                     Some(final_ident) => {
                         let static_methods_opt =
-                            csearch::get_static_methods_if_impl(self.session.cstore, def);
+                            csearch::get_static_methods_if_impl(&self.session.cstore, def);
                         match static_methods_opt {
                             Some(ref static_methods) if
                                 static_methods.len() >= 1 => {
@@ -1907,7 +1894,7 @@ fn populate_external_module(&mut self, module: @Module) {
             Some(def_id) => def_id,
         };
 
-        csearch::each_child_of_item(self.session.cstore,
+        csearch::each_child_of_item(&self.session.cstore,
                                     def_id,
                                     |def_like, child_ident, visibility| {
             debug!("(populating external module) ... found ident: {}",
@@ -1933,7 +1920,7 @@ fn populate_module_if_necessary(&mut self, module: @Module) {
     /// crate.
     fn build_reduced_graph_for_external_crate(&mut self,
                                               root: @Module) {
-        csearch::each_top_level_item_of_crate(self.session.cstore,
+        csearch::each_top_level_item_of_crate(&self.session.cstore,
                                               root.def_id
                                                   .get()
                                                   .unwrap()
@@ -1949,7 +1936,7 @@ fn build_reduced_graph_for_external_crate(&mut self,
     /// Creates and adds an import directive to the given module.
     fn build_import_directive(&mut self,
                               module_: @Module,
-                              module_path: ~[Ident],
+                              module_path: Vec<Ident> ,
                               subclass: @ImportDirectiveSubclass,
                               span: Span,
                               id: NodeId,
@@ -1957,12 +1944,7 @@ fn build_import_directive(&mut self,
         let directive = @ImportDirective::new(module_path,
                                               subclass, span, id,
                                               is_public);
-
-        {
-            let mut imports = module_.imports.borrow_mut();
-            imports.get().push(directive);
-        }
-
+        module_.imports.borrow_mut().push(directive);
         // Bump the reference count on the name. Or, if this is a glob, set
         // the appropriate flag.
 
@@ -1970,12 +1952,12 @@ fn build_import_directive(&mut self,
             SingleImport(target, _) => {
                 debug!("(building import directive) building import \
                         directive: {}::{}",
-                       self.idents_to_str(directive.module_path),
+                       self.idents_to_str(directive.module_path.as_slice()),
                        token::get_ident(target));
 
                 let mut import_resolutions = module_.import_resolutions
                                                     .borrow_mut();
-                match import_resolutions.get().find(&target.name) {
+                match import_resolutions.find(&target.name) {
                     Some(&resolution) => {
                         debug!("(building import directive) bumping \
                                 reference");
@@ -1990,8 +1972,7 @@ fn build_import_directive(&mut self,
                         debug!("(building import directive) creating new");
                         let resolution = @ImportResolution::new(id, is_public);
                         resolution.outstanding_references.set(1);
-                        import_resolutions.get().insert(target.name,
-                                                        resolution);
+                        import_resolutions.insert(target.name, resolution);
                     }
                 }
             }
@@ -2050,22 +2031,18 @@ fn resolve_imports_for_module_subtree(&mut self,
         self.resolve_imports_for_module(module_);
 
         self.populate_module_if_necessary(module_);
-        {
-            let children = module_.children.borrow();
-            for (_, &child_node) in children.get().iter() {
-                match child_node.get_module_if_available() {
-                    None => {
-                        // Nothing to do.
-                    }
-                    Some(child_module) => {
-                        self.resolve_imports_for_module_subtree(child_module);
-                    }
+        for (_, &child_node) in module_.children.borrow().iter() {
+            match child_node.get_module_if_available() {
+                None => {
+                    // Nothing to do.
+                }
+                Some(child_module) => {
+                    self.resolve_imports_for_module_subtree(child_module);
                 }
             }
         }
 
-        let anonymous_children = module_.anonymous_children.borrow();
-        for (_, &child_module) in anonymous_children.get().iter() {
+        for (_, &child_module) in module_.anonymous_children.borrow().iter() {
             self.resolve_imports_for_module_subtree(child_module);
         }
     }
@@ -2080,16 +2057,17 @@ fn resolve_imports_for_module(&mut self, module: @Module) {
         }
 
         let mut imports = module.imports.borrow_mut();
-        let import_count = imports.get().len();
+        let import_count = imports.len();
         while module.resolved_import_count.get() < import_count {
             let import_index = module.resolved_import_count.get();
-            let import_directive = imports.get()[import_index];
+            let import_directive = *imports.get(import_index);
             match self.resolve_import_for_module(module, import_directive) {
                 Failed => {
                     // We presumably emitted an error. Continue.
                     let msg = format!("failed to resolve import `{}`",
                                    self.import_path_to_str(
-                                       import_directive.module_path,
+                                       import_directive.module_path
+                                                       .as_slice(),
                                        *import_directive.subclass));
                     self.resolve_error(import_directive.span, msg);
                 }
@@ -2122,11 +2100,11 @@ fn idents_to_str(&mut self, idents: &[Ident]) -> ~str {
     }
 
     fn path_idents_to_str(&mut self, path: &Path) -> ~str {
-        let identifiers: ~[ast::Ident] = path.segments
+        let identifiers: Vec<ast::Ident> = path.segments
                                              .iter()
                                              .map(|seg| seg.identifier)
                                              .collect();
-        self.idents_to_str(identifiers)
+        self.idents_to_str(identifiers.as_slice())
     }
 
     fn import_directive_subclass_to_str(&mut self,
@@ -2167,7 +2145,7 @@ fn resolve_import_for_module(&mut self,
 
         debug!("(resolving import for module) resolving import `{}::...` in \
                 `{}`",
-               self.idents_to_str(*module_path),
+               self.idents_to_str(module_path.as_slice()),
                self.module_to_str(module_));
 
         // First, resolve the module path for the directive, if necessary.
@@ -2176,7 +2154,7 @@ fn resolve_import_for_module(&mut self,
             Some((self.graph_root.get_module(), LastMod(AllPublic)))
         } else {
             match self.resolve_module_path(module_,
-                                           *module_path,
+                                           module_path.as_slice(),
                                            DontUseLexicalScope,
                                            import_directive.span,
                                            ImportSearch) {
@@ -2293,21 +2271,18 @@ fn resolve_single_import(&mut self,
         // Search for direct children of the containing module.
         self.populate_module_if_necessary(containing_module);
 
-        {
-            let children = containing_module.children.borrow();
-            match children.get().find(&source.name) {
-                None => {
-                    // Continue.
+        match containing_module.children.borrow().find(&source.name) {
+            None => {
+                // Continue.
+            }
+            Some(child_name_bindings) => {
+                if child_name_bindings.defined_in_namespace(ValueNS) {
+                    value_result = BoundResult(containing_module,
+                                               *child_name_bindings);
                 }
-                Some(child_name_bindings) => {
-                    if child_name_bindings.defined_in_namespace(ValueNS) {
-                        value_result = BoundResult(containing_module,
-                                                   *child_name_bindings);
-                    }
-                    if child_name_bindings.defined_in_namespace(TypeNS) {
-                        type_result = BoundResult(containing_module,
-                                                  *child_name_bindings);
-                    }
+                if child_name_bindings.defined_in_namespace(TypeNS) {
+                    type_result = BoundResult(containing_module,
+                                              *child_name_bindings);
                 }
             }
         }
@@ -2334,7 +2309,7 @@ fn resolve_single_import(&mut self,
 
                 let import_resolutions = containing_module.import_resolutions
                                                           .borrow();
-                match import_resolutions.get().find(&source.name) {
+                match import_resolutions.find(&source.name) {
                     None => {
                         // The containing module definitely doesn't have an
                         // exported import with the name in question. We can
@@ -2408,13 +2383,8 @@ fn get_binding(this: &mut Resolver,
         match type_result {
             BoundResult(..) => {}
             _ => {
-                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 {
+                match containing_module.external_module_children.borrow_mut()
+                                       .find_copy(&source.name) {
                     None => {} // Continue.
                     Some(module) => {
                         let name_bindings =
@@ -2431,8 +2401,8 @@ fn get_binding(this: &mut Resolver,
         // We've successfully resolved the import. Write the results in.
         let import_resolution = {
             let import_resolutions = module_.import_resolutions.borrow();
-            assert!(import_resolutions.get().contains_key(&target.name));
-            import_resolutions.get().get_copy(&target.name)
+            assert!(import_resolutions.contains_key(&target.name));
+            import_resolutions.get_copy(&target.name)
         };
 
         match value_result {
@@ -2485,8 +2455,7 @@ fn get_binding(this: &mut Resolver,
         let value_private = match import_resolution.value_target.get() {
             Some(target) => {
                 let def = target.bindings.def_for_namespace(ValueNS).unwrap();
-                let mut def_map = self.def_map.borrow_mut();
-                def_map.get().insert(directive.id, def);
+                self.def_map.borrow_mut().insert(directive.id, def);
                 let did = def_id_of_def(def);
                 if value_used_public {Some(lp)} else {Some(DependsOn(did))}
             },
@@ -2497,8 +2466,7 @@ fn get_binding(this: &mut Resolver,
         let type_private = match import_resolution.type_target.get() {
             Some(target) => {
                 let def = target.bindings.def_for_namespace(TypeNS).unwrap();
-                let mut def_map = self.def_map.borrow_mut();
-                def_map.get().insert(directive.id, def);
+                self.def_map.borrow_mut().insert(directive.id, def);
                 let did = def_id_of_def(def);
                 if type_used_public {Some(lp)} else {Some(DependsOn(did))}
             },
@@ -2542,8 +2510,7 @@ fn resolve_glob_import(&mut self,
         // Add all resolved imports from the containing module.
         let import_resolutions = containing_module.import_resolutions
                                                   .borrow();
-        for (ident, target_import_resolution) in import_resolutions.get()
-                                                                   .iter() {
+        for (ident, target_import_resolution) in import_resolutions.iter() {
             debug!("(resolving glob import) writing module resolution \
                     {:?} into `{}`",
                    target_import_resolution.type_target.get().is_none(),
@@ -2555,9 +2522,8 @@ fn resolve_glob_import(&mut self,
             }
 
             // Here we merge two import resolutions.
-            let mut import_resolutions = module_.import_resolutions
-                                                .borrow_mut();
-            match import_resolutions.get().find(ident) {
+            let mut import_resolutions = module_.import_resolutions.borrow_mut();
+            match import_resolutions.find(ident) {
                 None => {
                     // Simple: just copy the old import resolution.
                     let new_import_resolution =
@@ -2567,7 +2533,7 @@ fn resolve_glob_import(&mut self,
                     new_import_resolution.type_target.set(
                         target_import_resolution.type_target.get());
 
-                    import_resolutions.get().insert
+                    import_resolutions.insert
                         (*ident, new_import_resolution);
                 }
                 Some(&dest_import_resolution) => {
@@ -2600,33 +2566,27 @@ fn resolve_glob_import(&mut self,
         // Add all children from the containing module.
         self.populate_module_if_necessary(containing_module);
 
-        {
-            let children = containing_module.children.borrow();
-            for (&name, name_bindings) in children.get().iter() {
-                self.merge_import_resolution(module_, containing_module,
-                                             id, is_public,
-                                             name, *name_bindings);
-            }
+        for (&name, name_bindings) in containing_module.children
+                                                       .borrow().iter() {
+            self.merge_import_resolution(module_, containing_module,
+                                         id, is_public,
+                                         name, *name_bindings);
         }
 
         // Add external module children from the containing module.
-        {
-            let external_module_children =
-                containing_module.external_module_children.borrow();
-            for (&name, module) in external_module_children.get().iter() {
-                let name_bindings =
-                    @Resolver::create_name_bindings_from_module(*module);
-                self.merge_import_resolution(module_, containing_module,
-                                             id, is_public,
-                                             name, name_bindings);
-            }
+        for (&name, module) in containing_module.external_module_children
+                                                .borrow().iter() {
+            let name_bindings =
+                @Resolver::create_name_bindings_from_module(*module);
+            self.merge_import_resolution(module_, containing_module,
+                                         id, is_public,
+                                         name, name_bindings);
         }
 
         // Record the destination of this import
         match containing_module.def_id.get() {
             Some(did) => {
-                let mut def_map = self.def_map.borrow_mut();
-                def_map.get().insert(id, DefMod(did));
+                self.def_map.borrow_mut().insert(id, DefMod(did));
                 self.last_private.insert(id, lp);
             }
             None => {}
@@ -2645,12 +2605,12 @@ fn merge_import_resolution(&mut self,
                                name_bindings: @NameBindings) {
         let dest_import_resolution;
         let mut import_resolutions = module_.import_resolutions.borrow_mut();
-        match import_resolutions.get().find(&name) {
+        match import_resolutions.find(&name) {
             None => {
                 // Create a new import resolution from this child.
                 dest_import_resolution =
                     @ImportResolution::new(id, is_public);
-                import_resolutions.get().insert(name,
+                import_resolutions.insert(name,
                                                 dest_import_resolution);
             }
             Some(&existing_import_resolution) => {
@@ -2916,25 +2876,21 @@ fn resolve_item_in_lexical_scope(&mut self,
         // its immediate children.
         self.populate_module_if_necessary(module_);
 
-        {
-            let children = module_.children.borrow();
-            match children.get().find(&name.name) {
-                Some(name_bindings)
-                        if name_bindings.defined_in_namespace(namespace) => {
-                    debug!("top name bindings succeeded");
-                    return Success((Target::new(module_, *name_bindings),
-                                   false));
-                }
-                Some(_) | None => { /* Not found; continue. */ }
+        match module_.children.borrow().find(&name.name) {
+            Some(name_bindings)
+                    if name_bindings.defined_in_namespace(namespace) => {
+                debug!("top name bindings succeeded");
+                return Success((Target::new(module_, *name_bindings),
+                               false));
             }
+            Some(_) | None => { /* Not found; continue. */ }
         }
 
         // Now check for its import directives. We don't have to have resolved
         // all its imports in the usual way; this is because chains of
         // adjacent import statements are processed as though they mutated the
         // current scope.
-        let import_resolutions = module_.import_resolutions.borrow();
-        match import_resolutions.get().find(&name.name) {
+        match module_.import_resolutions.borrow().find(&name.name) {
             None => {
                 // Not found; continue.
             }
@@ -2958,12 +2914,7 @@ fn resolve_item_in_lexical_scope(&mut self,
 
         // Search for external modules.
         if namespace == TypeNS {
-            let module_opt = {
-                let external_module_children =
-                    module_.external_module_children.borrow();
-                external_module_children.get().find_copy(&name.name)
-            };
-            match module_opt {
+            match module_.external_module_children.borrow().find_copy(&name.name) {
                 None => {}
                 Some(module) => {
                     let name_bindings =
@@ -3192,18 +3143,15 @@ fn resolve_name_in_module(&mut self,
         // First, check the direct children of the module.
         self.populate_module_if_necessary(module_);
 
-        {
-            let children = module_.children.borrow();
-            match children.get().find(&name.name) {
-                Some(name_bindings)
-                        if name_bindings.defined_in_namespace(namespace) => {
-                    debug!("(resolving name in module) found node as child");
-                    return Success((Target::new(module_, *name_bindings),
-                                   false));
-                }
-                Some(_) | None => {
-                    // Continue.
-                }
+        match module_.children.borrow().find(&name.name) {
+            Some(name_bindings)
+                    if name_bindings.defined_in_namespace(namespace) => {
+                debug!("(resolving name in module) found node as child");
+                return Success((Target::new(module_, *name_bindings),
+                               false));
+            }
+            Some(_) | None => {
+                // Continue.
             }
         }
 
@@ -3216,8 +3164,7 @@ fn resolve_name_in_module(&mut self,
         }
 
         // Check the list of resolved imports.
-        let import_resolutions = module_.import_resolutions.borrow();
-        match import_resolutions.get().find(&name.name) {
+        match module_.import_resolutions.borrow().find(&name.name) {
             Some(import_resolution) => {
                 if import_resolution.is_public.get() &&
                         import_resolution.outstanding_references.get() != 0 {
@@ -3244,12 +3191,7 @@ fn resolve_name_in_module(&mut self,
 
         // Finally, search through external children.
         if namespace == TypeNS {
-            let module_opt = {
-                let external_module_children =
-                    module_.external_module_children.borrow();
-                external_module_children.get().find_copy(&name.name)
-            };
-            match module_opt {
+            match module_.external_module_children.borrow().find_copy(&name.name) {
                 None => {}
                 Some(module) => {
                     let name_bindings =
@@ -3267,42 +3209,38 @@ fn resolve_name_in_module(&mut self,
 
     fn report_unresolved_imports(&mut self, module_: @Module) {
         let index = module_.resolved_import_count.get();
-        let mut imports = module_.imports.borrow_mut();
-        let import_count = imports.get().len();
+        let imports = module_.imports.borrow();
+        let import_count = imports.len();
         if index != import_count {
             let sn = self.session
-                         .codemap
-                         .span_to_snippet(imports.get()[index].span)
+                         .codemap()
+                         .span_to_snippet(imports.get(index).span)
                          .unwrap();
             if sn.contains("::") {
-                self.resolve_error(imports.get()[index].span,
+                self.resolve_error(imports.get(index).span,
                                    "unresolved import");
             } else {
                 let err = format!("unresolved import (maybe you meant `{}::*`?)",
                                sn.slice(0, sn.len()));
-                self.resolve_error(imports.get()[index].span, err);
+                self.resolve_error(imports.get(index).span, err);
             }
         }
 
         // Descend into children and anonymous children.
         self.populate_module_if_necessary(module_);
 
-        {
-            let children = module_.children.borrow();
-            for (_, &child_node) in children.get().iter() {
-                match child_node.get_module_if_available() {
-                    None => {
-                        // Continue.
-                    }
-                    Some(child_module) => {
-                        self.report_unresolved_imports(child_module);
-                    }
+        for (_, &child_node) in module_.children.borrow().iter() {
+            match child_node.get_module_if_available() {
+                None => {
+                    // Continue.
+                }
+                Some(child_module) => {
+                    self.report_unresolved_imports(child_module);
                 }
             }
         }
 
-        let anonymous_children = module_.anonymous_children.borrow();
-        for (_, &module_) in anonymous_children.get().iter() {
+        for (_, &module_) in module_.anonymous_children.borrow().iter() {
             self.report_unresolved_imports(module_);
         }
     }
@@ -3351,34 +3289,29 @@ fn record_exports_for_module_subtree(&mut self,
         self.record_exports_for_module(module_);
         self.populate_module_if_necessary(module_);
 
-        {
-            let children = module_.children.borrow();
-            for (_, &child_name_bindings) in children.get().iter() {
-                match child_name_bindings.get_module_if_available() {
-                    None => {
-                        // Nothing to do.
-                    }
-                    Some(child_module) => {
-                        self.record_exports_for_module_subtree(child_module);
-                    }
+        for (_, &child_name_bindings) in module_.children.borrow().iter() {
+            match child_name_bindings.get_module_if_available() {
+                None => {
+                    // Nothing to do.
+                }
+                Some(child_module) => {
+                    self.record_exports_for_module_subtree(child_module);
                 }
             }
         }
 
-        let anonymous_children = module_.anonymous_children.borrow();
-        for (_, &child_module) in anonymous_children.get().iter() {
+        for (_, &child_module) in module_.anonymous_children.borrow().iter() {
             self.record_exports_for_module_subtree(child_module);
         }
     }
 
     fn record_exports_for_module(&mut self, module_: @Module) {
-        let mut exports2 = ~[];
+        let mut exports2 = Vec::new();
 
         self.add_exports_for_module(&mut exports2, module_);
         match module_.def_id.get() {
             Some(def_id) => {
-                let mut export_map2 = self.export_map2.borrow_mut();
-                export_map2.get().insert(def_id.node, exports2);
+                self.export_map2.borrow_mut().insert(def_id.node, exports2);
                 debug!("(computing exports) writing exports for {} (some)",
                        def_id.node);
             }
@@ -3387,7 +3320,7 @@ fn record_exports_for_module(&mut self, module_: @Module) {
     }
 
     fn add_exports_of_namebindings(&mut self,
-                                   exports2: &mut ~[Export2],
+                                   exports2: &mut Vec<Export2> ,
                                    name: Name,
                                    namebindings: @NameBindings,
                                    ns: Namespace) {
@@ -3408,10 +3341,9 @@ fn add_exports_of_namebindings(&mut self,
     }
 
     fn add_exports_for_module(&mut self,
-                              exports2: &mut ~[Export2],
+                              exports2: &mut Vec<Export2> ,
                               module_: @Module) {
-        let import_resolutions = module_.import_resolutions.borrow();
-        for (name, importresolution) in import_resolutions.get().iter() {
+        for (name, importresolution) in module_.import_resolutions.borrow().iter() {
             if !importresolution.is_public.get() {
                 continue
             }
@@ -3461,8 +3393,7 @@ fn with_scope(&mut self, name: Option<Ident>, f: |&mut Resolver|) {
             Some(name) => {
                 self.populate_module_if_necessary(orig_module);
 
-                let children = orig_module.children.borrow();
-                match children.get().find(&name.name) {
+                match orig_module.children.borrow().find(&name.name) {
                     None => {
                         debug!("!!! (with scope) didn't find `{}` in `{}`",
                                token::get_ident(name),
@@ -3493,7 +3424,7 @@ fn with_scope(&mut self, name: Option<Ident>, f: |&mut Resolver|) {
     /// Wraps the given definition in the appropriate number of `def_upvar`
     /// wrappers.
     fn upvarify(&mut self,
-                    ribs: &mut ~[@Rib],
+                    ribs: &mut Vec<@Rib> ,
                     rib_index: uint,
                     def_like: DefLike,
                     span: Span)
@@ -3518,7 +3449,7 @@ fn upvarify(&mut self,
 
         let mut rib_index = rib_index + 1;
         while rib_index < ribs.len() {
-            match ribs[rib_index].kind {
+            match ribs.get(rib_index).kind {
                 NormalRibKind => {
                     // Nothing to do. Continue.
                 }
@@ -3535,8 +3466,7 @@ fn upvarify(&mut self,
                   // item, it's ok
                   match def {
                     DefTyParam(did, _) if {
-                        let def_map = self.def_map.borrow();
-                        def_map.get().find(&did.node).map(|x| *x)
+                        self.def_map.borrow().find(&did.node).map(|x| *x)
                             == Some(DefTyParamBinder(item_id))
                     } => {
                       // ok
@@ -3608,7 +3538,7 @@ fn upvarify(&mut self,
     }
 
     fn search_ribs(&mut self,
-                       ribs: &mut ~[@Rib],
+                       ribs: &mut Vec<@Rib> ,
                        name: Name,
                        span: Span)
                        -> Option<DefLike> {
@@ -3618,10 +3548,7 @@ fn search_ribs(&mut self,
         let mut i = ribs.len();
         while i != 0 {
             i -= 1;
-            let binding_opt = {
-                let bindings = ribs[i].bindings.borrow();
-                bindings.get().find_copy(&name)
-            };
+            let binding_opt = ribs.get(i).bindings.borrow().find_copy(&name);
             match binding_opt {
                 Some(def_like) => {
                     return self.upvarify(ribs, i, def_like, span);
@@ -3690,22 +3617,17 @@ fn resolve_item(&mut self, item: &Item) {
                                             generics,
                                             implemented_traits,
                                             self_type,
-                                            *methods);
+                                            methods.as_slice());
             }
 
             ItemTrait(ref generics, ref traits, ref methods) => {
                 // Create a new rib for the self type.
                 let self_type_rib = @Rib::new(NormalRibKind);
-                {
-                    let mut type_ribs = self.type_ribs.borrow_mut();
-                    type_ribs.get().push(self_type_rib);
-                }
+                self.type_ribs.borrow_mut().push(self_type_rib);
                 // plain insert (no renaming)
                 let name = self.type_self_ident.name;
-                {
-                    let mut bindings = self_type_rib.bindings.borrow_mut();
-                    bindings.get().insert(name, DlDef(DefSelfTy(item.id)));
-                }
+                self_type_rib.bindings.borrow_mut()
+                             .insert(name, DlDef(DefSelfTy(item.id)));
 
                 // Create a new rib for the trait-wide type parameters.
                 self.with_type_parameter_rib(HasTypeParameters(generics,
@@ -3757,14 +3679,13 @@ fn resolve_item(&mut self, item: &Item) {
                     }
                 });
 
-                let mut type_ribs = self.type_ribs.borrow_mut();
-                type_ribs.get().pop();
+                self.type_ribs.borrow_mut().pop();
             }
 
             ItemStruct(ref struct_def, ref generics) => {
                 self.resolve_struct(item.id,
                                     generics,
-                                    struct_def.fields);
+                                    struct_def.fields.as_slice());
             }
 
             ItemMod(ref module_) => {
@@ -3828,10 +3749,7 @@ fn with_type_parameter_rib(&mut self,
                               rib_kind) => {
 
                 let function_type_rib = @Rib::new(rib_kind);
-                {
-                    let mut type_ribs = self.type_ribs.borrow_mut();
-                    type_ribs.get().push(function_type_rib);
-                }
+                self.type_ribs.borrow_mut().push(function_type_rib);
 
                 for (index, type_parameter) in generics.ty_params.iter().enumerate() {
                     let ident = type_parameter.ident;
@@ -3845,9 +3763,8 @@ fn with_type_parameter_rib(&mut self,
                     self.record_def(type_parameter.id,
                                     (DefTyParamBinder(node_id), LastMod(AllPublic)));
                     // plain insert (no renaming)
-                    let mut bindings = function_type_rib.bindings
-                                                        .borrow_mut();
-                    bindings.get().insert(ident.name, def_like);
+                    function_type_rib.bindings.borrow_mut()
+                                     .insert(ident.name, def_like);
                 }
             }
 
@@ -3859,45 +3776,23 @@ fn with_type_parameter_rib(&mut self,
         f(self);
 
         match type_parameters {
-            HasTypeParameters(..) => {
-                let mut type_ribs = self.type_ribs.borrow_mut();
-                type_ribs.get().pop();
-            }
-
-            NoTypeParameters => {
-                // Nothing to do.
-            }
+            HasTypeParameters(..) => { self.type_ribs.borrow_mut().pop(); }
+            NoTypeParameters => { }
         }
     }
 
     fn with_label_rib(&mut self, f: |&mut Resolver|) {
-        {
-            let mut label_ribs = self.label_ribs.borrow_mut();
-            label_ribs.get().push(@Rib::new(NormalRibKind));
-        }
-
+        self.label_ribs.borrow_mut().push(@Rib::new(NormalRibKind));
         f(self);
-
-        {
-            let mut label_ribs = self.label_ribs.borrow_mut();
-            label_ribs.get().pop();
-        }
+        self.label_ribs.borrow_mut().pop();
     }
 
     fn with_constant_rib(&mut self, f: |&mut Resolver|) {
-        {
-            let mut value_ribs = self.value_ribs.borrow_mut();
-            let mut type_ribs = self.type_ribs.borrow_mut();
-            value_ribs.get().push(@Rib::new(ConstantItemRibKind));
-            type_ribs.get().push(@Rib::new(ConstantItemRibKind));
-        }
+        self.value_ribs.borrow_mut().push(@Rib::new(ConstantItemRibKind));
+        self.type_ribs.borrow_mut().push(@Rib::new(ConstantItemRibKind));
         f(self);
-        {
-            let mut value_ribs = self.value_ribs.borrow_mut();
-            let mut type_ribs = self.type_ribs.borrow_mut();
-            type_ribs.get().pop();
-            value_ribs.get().pop();
-        }
+        self.type_ribs.borrow_mut().pop();
+        self.value_ribs.borrow_mut().pop();
     }
 
     fn resolve_function(&mut self,
@@ -3907,17 +3802,11 @@ fn resolve_function(&mut self,
                         block: P<Block>) {
         // Create a value rib for the function.
         let function_value_rib = @Rib::new(rib_kind);
-        {
-            let mut value_ribs = self.value_ribs.borrow_mut();
-            value_ribs.get().push(function_value_rib);
-        }
+        self.value_ribs.borrow_mut().push(function_value_rib);
 
         // Create a label rib for the function.
-        {
-            let mut label_ribs = self.label_ribs.borrow_mut();
-            let function_label_rib = @Rib::new(rib_kind);
-            label_ribs.get().push(function_label_rib);
-        }
+        let function_label_rib = @Rib::new(rib_kind);
+        self.label_ribs.borrow_mut().push(function_label_rib);
 
         // If this function has type parameters, add them now.
         self.with_type_parameter_rib(type_parameters, |this| {
@@ -3958,15 +3847,12 @@ fn resolve_function(&mut self,
             debug!("(resolving function) leaving function");
         });
 
-        let mut label_ribs = self.label_ribs.borrow_mut();
-        label_ribs.get().pop();
-
-        let mut value_ribs = self.value_ribs.borrow_mut();
-        value_ribs.get().pop();
+        self.label_ribs.borrow_mut().pop();
+        self.value_ribs.borrow_mut().pop();
     }
 
     fn resolve_type_parameters(&mut self,
-                                   type_parameters: &OptVec<TyParam>) {
+                                   type_parameters: &OwnedSlice<TyParam>) {
         for type_parameter in type_parameters.iter() {
             for bound in type_parameter.bounds.iter() {
                 self.resolve_type_parameter_bound(type_parameter.id, bound);
@@ -4093,13 +3979,10 @@ fn resolve_implementation(&mut self,
                         TraitImplementation);
 
                     // Record the current set of trait references.
-                    let mut new_trait_refs = ~[];
-                    {
-                        let def_map = this.def_map.borrow();
-                        let r = def_map.get().find(&trait_reference.ref_id);
-                        for &def in r.iter() {
-                            new_trait_refs.push(def_id_of_def(*def));
-                        }
+                    let mut new_trait_refs = Vec::new();
+                    for &def in this.def_map.borrow()
+                                    .find(&trait_reference.ref_id).iter() {
+                        new_trait_refs.push(def_id_of_def(*def));
                     }
                     original_trait_refs = Some(replace(
                         &mut this.current_trait_refs,
@@ -4176,7 +4059,7 @@ fn resolve_local(&mut self, local: &Local) {
     fn binding_mode_map(&mut self, pat: @Pat) -> BindingMap {
         let mut result = HashMap::new();
         pat_bindings(self.def_map, pat, |binding_mode, _id, sp, path| {
-            let name = mtwt_resolve(path_to_ident(path));
+            let name = mtwt::resolve(path_to_ident(path));
             result.insert(name,
                           binding_info {span: sp,
                                         binding_mode: binding_mode});
@@ -4187,8 +4070,10 @@ fn binding_mode_map(&mut self, pat: @Pat) -> BindingMap {
     // check that all of the arms in an or-pattern have exactly the
     // same set of bindings, with the same binding modes for each.
     fn check_consistent_bindings(&mut self, arm: &Arm) {
-        if arm.pats.len() == 0 { return; }
-        let map_0 = self.binding_mode_map(arm.pats[0]);
+        if arm.pats.len() == 0 {
+            return
+        }
+        let map_0 = self.binding_mode_map(*arm.pats.get(0));
         for (i, p) in arm.pats.iter().enumerate() {
             let map_i = self.binding_mode_map(*p);
 
@@ -4229,10 +4114,7 @@ fn check_consistent_bindings(&mut self, arm: &Arm) {
     }
 
     fn resolve_arm(&mut self, arm: &Arm) {
-        {
-            let mut value_ribs = self.value_ribs.borrow_mut();
-            value_ribs.get().push(@Rib::new(NormalRibKind));
-        }
+        self.value_ribs.borrow_mut().push(@Rib::new(NormalRibKind));
 
         let mut bindings_list = HashMap::new();
         for pattern in arm.pats.iter() {
@@ -4246,25 +4128,21 @@ fn resolve_arm(&mut self, arm: &Arm) {
         self.check_consistent_bindings(arm);
 
         visit::walk_expr_opt(self, arm.guard, ());
-        self.resolve_block(arm.body);
+        self.resolve_expr(arm.body);
 
-        let mut value_ribs = self.value_ribs.borrow_mut();
-        value_ribs.get().pop();
+        self.value_ribs.borrow_mut().pop();
     }
 
     fn resolve_block(&mut self, block: &Block) {
         debug!("(resolving block) entering block");
-        {
-            let mut value_ribs = self.value_ribs.borrow_mut();
-            value_ribs.get().push(@Rib::new(NormalRibKind));
-        }
+        self.value_ribs.borrow_mut().push(@Rib::new(NormalRibKind));
 
         // Move down in the graph, if there's an anonymous module rooted here.
         let orig_module = self.current_module;
         let anonymous_children = self.current_module
                                      .anonymous_children
                                      .borrow();
-        match anonymous_children.get().find(&block.id) {
+        match anonymous_children.find(&block.id) {
             None => { /* Nothing to do. */ }
             Some(&anonymous_module) => {
                 debug!("(resolving block) found anonymous module, moving \
@@ -4279,8 +4157,7 @@ fn resolve_block(&mut self, block: &Block) {
         // Move back up.
         self.current_module = orig_module;
 
-        let mut value_ribs = self.value_ribs.borrow_mut();
-        value_ribs.get().pop();
+        self.value_ribs.borrow_mut().pop();
         debug!("(resolving block) leaving block");
     }
 
@@ -4291,7 +4168,7 @@ fn resolve_type(&mut self, ty: &Ty) {
 
             TyPath(ref path, ref bounds, path_id) => {
                 // This is a path in the type namespace. Walk through scopes
-                // scopes looking for it.
+                // looking for it.
                 let mut result_def = None;
 
                 // First, check to see whether the name is a primitive type.
@@ -4408,8 +4285,8 @@ fn resolve_pattern(&mut self,
                     // such a value is simply disallowed (since it's rarely
                     // what you want).
 
-                    let ident = path.segments[0].identifier;
-                    let renamed = mtwt_resolve(ident);
+                    let ident = path.segments.get(0).identifier;
+                    let renamed = mtwt::resolve(ident);
 
                     match self.resolve_bare_identifier_pattern(ident) {
                         FoundStructOrEnumVariant(def, lp)
@@ -4485,16 +4362,12 @@ struct in scope",
                                 Some(ref mut bindings_list)
                                 if !bindings_list.contains_key(&renamed) => {
                                     let this = &mut *self;
-                                    {
-                                        let mut value_ribs =
-                                            this.value_ribs.borrow_mut();
-                                        let last_rib = value_ribs.get()[
-                                            value_ribs.get().len() - 1];
-                                        let mut bindings =
-                                            last_rib.bindings.borrow_mut();
-                                        bindings.get().insert(renamed,
-                                                              DlDef(def));
-                                    }
+                                    let value_ribs = this.value_ribs.borrow();
+                                    let length = value_ribs.len();
+                                    let last_rib = value_ribs.get(
+                                        length - 1);
+                                    last_rib.bindings.borrow_mut()
+                                            .insert(renamed, DlDef(def));
                                     bindings_list.insert(renamed, pat_id);
                                 }
                                 Some(ref mut b) => {
@@ -4512,14 +4385,12 @@ struct in scope",
                                 None => {
                                     let this = &mut *self;
                                     {
-                                        let mut value_ribs =
-                                            this.value_ribs.borrow_mut();
-                                        let last_rib = value_ribs.get()[
-                                                value_ribs.get().len() - 1];
-                                        let mut bindings =
-                                            last_rib.bindings.borrow_mut();
-                                        bindings.get().insert(renamed,
-                                                              DlDef(def));
+                                        let value_ribs = this.value_ribs.borrow();
+                                        let length = value_ribs.len();
+                                        let last_rib = value_ribs.get(
+                                                length - 1);
+                                        last_rib.bindings.borrow_mut()
+                                                .insert(renamed, DlDef(def));
                                     }
                                 }
                             }
@@ -4767,31 +4638,26 @@ fn resolve_definition_of_name_in_module(&mut self,
         // First, search children.
         self.populate_module_if_necessary(containing_module);
 
-        {
-            let children = containing_module.children.borrow();
-            match children.get().find(&name.name) {
-                Some(child_name_bindings) => {
-                    match child_name_bindings.def_for_namespace(namespace) {
-                        Some(def) => {
-                            // Found it. Stop the search here.
-                            let p = child_name_bindings.defined_in_public_namespace(
-                                            namespace);
-                            let lp = if p {LastMod(AllPublic)} else {
-                                LastMod(DependsOn(def_id_of_def(def)))
-                            };
-                            return ChildNameDefinition(def, lp);
-                        }
-                        None => {}
+        match containing_module.children.borrow().find(&name.name) {
+            Some(child_name_bindings) => {
+                match child_name_bindings.def_for_namespace(namespace) {
+                    Some(def) => {
+                        // Found it. Stop the search here.
+                        let p = child_name_bindings.defined_in_public_namespace(
+                                        namespace);
+                        let lp = if p {LastMod(AllPublic)} else {
+                            LastMod(DependsOn(def_id_of_def(def)))
+                        };
+                        return ChildNameDefinition(def, lp);
                     }
+                    None => {}
                 }
-                None => {}
             }
+            None => {}
         }
 
         // Next, search import resolutions.
-        let import_resolutions = containing_module.import_resolutions
-                                                  .borrow();
-        match import_resolutions.get().find(&name.name) {
+        match containing_module.import_resolutions.borrow().find(&name.name) {
             Some(import_resolution) if import_resolution.is_public.get() => {
                 match (*import_resolution).target_for_namespace(namespace) {
                     Some(target) => {
@@ -4816,12 +4682,8 @@ fn resolve_definition_of_name_in_module(&mut self,
 
         // Finally, search through external children.
         if namespace == TypeNS {
-            let module_opt = {
-                let external_module_children =
-                    containing_module.external_module_children.borrow();
-                external_module_children.get().find_copy(&name.name)
-            };
-            match module_opt {
+            match containing_module.external_module_children.borrow()
+                                   .find_copy(&name.name) {
                 None => {}
                 Some(module) => {
                     match module.def_id.get() {
@@ -4885,8 +4747,7 @@ fn resolve_module_relative_path(&mut self,
         };
         match containing_module.kind.get() {
             TraitModuleKind | ImplModuleKind => {
-                let method_map = self.method_map.borrow();
-                match method_map.get().find(&ident.name) {
+                match self.method_map.borrow().find(&ident.name) {
                     Some(s) => {
                         match containing_module.def_id.get() {
                             Some(def_id) if s.contains(&def_id) => {
@@ -4960,23 +4821,17 @@ fn resolve_identifier_in_local_ribs(&mut self,
                                             span: Span)
                                             -> Option<Def> {
         // Check the local set of ribs.
-        let search_result;
-        match namespace {
+        let search_result = match namespace {
             ValueNS => {
-                let renamed = mtwt_resolve(ident);
-                let mut value_ribs = self.value_ribs.borrow_mut();
-                search_result = self.search_ribs(value_ribs.get(),
-                                                 renamed,
-                                                 span);
+                let renamed = mtwt::resolve(ident);
+                self.search_ribs(&mut *self.value_ribs.borrow_mut(),
+                                 renamed, span)
             }
             TypeNS => {
                 let name = ident.name;
-                let mut type_ribs = self.type_ribs.borrow_mut();
-                search_result = self.search_ribs(type_ribs.get(),
-                                                 name,
-                                                 span);
+                self.search_ribs(&mut *self.type_ribs.borrow_mut(), name, span)
             }
-        }
+        };
 
         match search_result {
             Some(DlDef(def)) => {
@@ -5050,18 +4905,15 @@ fn find_best_match_for_name(&mut self, name: &str, max_distance: uint)
                                 -> Option<~str> {
         let this = &mut *self;
 
-        let mut maybes: ~[token::InternedString] = ~[];
-        let mut values: ~[uint] = ~[];
+        let mut maybes: Vec<token::InternedString> = Vec::new();
+        let mut values: Vec<uint> = Vec::new();
 
-        let mut j = {
-            let value_ribs = this.value_ribs.borrow();
-            value_ribs.get().len()
-        };
+        let mut j = this.value_ribs.borrow().len();
         while j != 0 {
             j -= 1;
             let value_ribs = this.value_ribs.borrow();
-            let bindings = value_ribs.get()[j].bindings.borrow();
-            for (&k, _) in bindings.get().iter() {
+            let bindings = value_ribs.get(j).bindings.borrow();
+            for (&k, _) in bindings.iter() {
                 maybes.push(token::get_name(k));
                 values.push(uint::MAX);
             }
@@ -5069,20 +4921,20 @@ fn find_best_match_for_name(&mut self, name: &str, max_distance: uint)
 
         let mut smallest = 0;
         for (i, other) in maybes.iter().enumerate() {
-            values[i] = name.lev_distance(other.get());
+            *values.get_mut(i) = name.lev_distance(other.get());
 
-            if values[i] <= values[smallest] {
+            if *values.get(i) <= *values.get(smallest) {
                 smallest = i;
             }
         }
 
         if values.len() > 0 &&
-            values[smallest] != uint::MAX &&
-            values[smallest] < name.len() + 2 &&
-            values[smallest] <= max_distance &&
-            name != maybes[smallest].get() {
+            *values.get(smallest) != uint::MAX &&
+            *values.get(smallest) < name.len() + 2 &&
+            *values.get(smallest) <= max_distance &&
+            name != maybes.get(smallest).get() {
 
-            Some(maybes[smallest].get().to_str())
+            Some(maybes.get(smallest).get().to_str())
 
         } else {
             None
@@ -5206,13 +5058,13 @@ fn resolve_expr(&mut self, expr: &Expr) {
             ExprLoop(_, Some(label)) => {
                 self.with_label_rib(|this| {
                     let def_like = DlDef(DefLabel(expr.id));
+
                     {
-                        let mut label_ribs = this.label_ribs.borrow_mut();
-                        let rib = label_ribs.get()[label_ribs.get().len() -
-                                                   1];
-                        let mut bindings = rib.bindings.borrow_mut();
-                        let renamed = mtwt_resolve(label);
-                        bindings.get().insert(renamed, def_like);
+                        let label_ribs = this.label_ribs.borrow();
+                        let length = label_ribs.len();
+                        let rib = label_ribs.get(length - 1);
+                        let renamed = mtwt::resolve(label);
+                        rib.bindings.borrow_mut().insert(renamed, def_like);
                     }
 
                     visit::walk_expr(this, expr, ());
@@ -5223,8 +5075,8 @@ fn resolve_expr(&mut self, expr: &Expr) {
 
             ExprBreak(Some(label)) | ExprAgain(Some(label)) => {
                 let mut label_ribs = self.label_ribs.borrow_mut();
-                let renamed = mtwt_resolve(label);
-                match self.search_ribs(label_ribs.get(), renamed, expr.span) {
+                let renamed = mtwt::resolve(label);
+                match self.search_ribs(&mut *label_ribs, renamed, expr.span) {
                     None =>
                         self.resolve_error(expr.span,
                                               format!("use of undeclared label `{}`",
@@ -5255,75 +5107,14 @@ fn record_candidate_traits_for_expr_if_necessary(&mut self, expr: &Expr) {
                 // the field name so that we can do some nice error reporting
                 // later on in typeck.
                 let traits = self.search_for_traits_containing_method(ident);
-                self.trait_map.insert(expr.id, @RefCell::new(traits));
+                self.trait_map.insert(expr.id, traits);
             }
-            ExprMethodCall(_, ident, _, _) => {
+            ExprMethodCall(ident, _, _) => {
                 debug!("(recording candidate traits for expr) recording \
                         traits for {}",
                        expr.id);
                 let traits = self.search_for_traits_containing_method(ident);
-                self.trait_map.insert(expr.id, @RefCell::new(traits));
-            }
-            ExprBinary(_, BiAdd, _, _) | ExprAssignOp(_, BiAdd, _, _) => {
-                let i = self.lang_items.add_trait();
-                self.add_fixed_trait_for_expr(expr.id, i);
-            }
-            ExprBinary(_, BiSub, _, _) | ExprAssignOp(_, BiSub, _, _) => {
-                let i = self.lang_items.sub_trait();
-                self.add_fixed_trait_for_expr(expr.id, i);
-            }
-            ExprBinary(_, BiMul, _, _) | ExprAssignOp(_, BiMul, _, _) => {
-                let i = self.lang_items.mul_trait();
-                self.add_fixed_trait_for_expr(expr.id, i);
-            }
-            ExprBinary(_, BiDiv, _, _) | ExprAssignOp(_, BiDiv, _, _) => {
-                let i = self.lang_items.div_trait();
-                self.add_fixed_trait_for_expr(expr.id, i);
-            }
-            ExprBinary(_, BiRem, _, _) | ExprAssignOp(_, BiRem, _, _) => {
-                let i = self.lang_items.rem_trait();
-                self.add_fixed_trait_for_expr(expr.id, i);
-            }
-            ExprBinary(_, BiBitXor, _, _) | ExprAssignOp(_, BiBitXor, _, _) => {
-                let i = self.lang_items.bitxor_trait();
-                self.add_fixed_trait_for_expr(expr.id, i);
-            }
-            ExprBinary(_, BiBitAnd, _, _) | ExprAssignOp(_, BiBitAnd, _, _) => {
-                let i = self.lang_items.bitand_trait();
-                self.add_fixed_trait_for_expr(expr.id, i);
-            }
-            ExprBinary(_, BiBitOr, _, _) | ExprAssignOp(_, BiBitOr, _, _) => {
-                let i = self.lang_items.bitor_trait();
-                self.add_fixed_trait_for_expr(expr.id, i);
-            }
-            ExprBinary(_, BiShl, _, _) | ExprAssignOp(_, BiShl, _, _) => {
-                let i = self.lang_items.shl_trait();
-                self.add_fixed_trait_for_expr(expr.id, i);
-            }
-            ExprBinary(_, BiShr, _, _) | ExprAssignOp(_, BiShr, _, _) => {
-                let i = self.lang_items.shr_trait();
-                self.add_fixed_trait_for_expr(expr.id, i);
-            }
-            ExprBinary(_, BiLt, _, _) | ExprBinary(_, BiLe, _, _) |
-            ExprBinary(_, BiGe, _, _) | ExprBinary(_, BiGt, _, _) => {
-                let i = self.lang_items.ord_trait();
-                self.add_fixed_trait_for_expr(expr.id, i);
-            }
-            ExprBinary(_, BiEq, _, _) | ExprBinary(_, BiNe, _, _) => {
-                let i = self.lang_items.eq_trait();
-                self.add_fixed_trait_for_expr(expr.id, i);
-            }
-            ExprUnary(_, UnNeg, _) => {
-                let i = self.lang_items.neg_trait();
-                self.add_fixed_trait_for_expr(expr.id, i);
-            }
-            ExprUnary(_, UnNot, _) => {
-                let i = self.lang_items.not_trait();
-                self.add_fixed_trait_for_expr(expr.id, i);
-            }
-            ExprIndex(..) => {
-                let i = self.lang_items.index_trait();
-                self.add_fixed_trait_for_expr(expr.id, i);
+                self.trait_map.insert(expr.id, traits);
             }
             _ => {
                 // Nothing to do.
@@ -5331,14 +5122,13 @@ fn record_candidate_traits_for_expr_if_necessary(&mut self, expr: &Expr) {
         }
     }
 
-    fn search_for_traits_containing_method(&mut self, name: Ident) -> ~[DefId] {
+    fn search_for_traits_containing_method(&mut self, name: Ident) -> Vec<DefId> {
         debug!("(searching for traits containing method) looking for '{}'",
                token::get_ident(name));
 
-        let mut found_traits = ~[];
+        let mut found_traits = Vec::new();
         let mut search_module = self.current_module;
-        let method_map = self.method_map.borrow();
-        match method_map.get().find(&name.name) {
+        match self.method_map.borrow().find(&name.name) {
             Some(candidate_traits) => loop {
                 // Look for the current trait.
                 match self.current_trait_refs {
@@ -5359,8 +5149,7 @@ fn search_for_traits_containing_method(&mut self, name: Ident) -> ~[DefId] {
                 // Look for trait children.
                 self.populate_module_if_necessary(search_module);
 
-                let children = search_module.children.borrow();
-                for (_, &child_names) in children.get().iter() {
+                for (_, &child_names) in search_module.children.borrow().iter() {
                     let def = match child_names.def_for_namespace(TypeNS) {
                         Some(def) => def,
                         None => continue
@@ -5378,7 +5167,7 @@ fn search_for_traits_containing_method(&mut self, name: Ident) -> ~[DefId] {
                 // Look for imports.
                 let import_resolutions = search_module.import_resolutions
                                                       .borrow();
-                for (_, &import) in import_resolutions.get().iter() {
+                for (_, &import) in import_resolutions.iter() {
                     let target = match import.target_for_namespace(TypeNS) {
                         None => continue,
                         Some(target) => target,
@@ -5407,7 +5196,7 @@ fn search_for_traits_containing_method(&mut self, name: Ident) -> ~[DefId] {
     }
 
     fn add_trait_info(&self,
-                          found_traits: &mut ~[DefId],
+                          found_traits: &mut Vec<DefId> ,
                           trait_def_id: DefId,
                           name: Ident) {
         debug!("(adding trait info) found trait {}:{} for method '{}'",
@@ -5417,25 +5206,13 @@ fn add_trait_info(&self,
         found_traits.push(trait_def_id);
     }
 
-    fn add_fixed_trait_for_expr(&mut self,
-                                    expr_id: NodeId,
-                                    trait_id: Option<DefId>) {
-        match trait_id {
-            Some(trait_id) => {
-                self.trait_map.insert(expr_id, @RefCell::new(~[trait_id]));
-            }
-            None => {}
-        }
-    }
-
     fn record_def(&mut self, node_id: NodeId, (def, lp): (Def, LastPrivate)) {
         debug!("(recording def) recording {:?} for {:?}, last private {:?}",
                 def, node_id, lp);
         assert!(match lp {LastImport{..} => false, _ => true},
                 "Import should only be used for `use` directives");
         self.last_private.insert(node_id, lp);
-        let mut def_map = self.def_map.borrow_mut();
-        def_map.get().insert_or_update_with(node_id, def, |_, old_value| {
+        self.def_map.borrow_mut().insert_or_update_with(node_id, def, |_, old_value| {
             // Resolve appears to "resolve" the same ID multiple
             // times, so here is a sanity check it at least comes to
             // the same conclusion! - nmatsakis
@@ -5483,7 +5260,7 @@ fn check_for_item_unused_imports(&mut self, vi: &ViewItem) {
         if vi.span == DUMMY_SP { return }
 
         match vi.node {
-            ViewItemExternMod(..) => {} // ignore
+            ViewItemExternCrate(..) => {} // ignore
             ViewItemUse(ref path) => {
                 for p in path.iter() {
                     match p.node {
@@ -5513,7 +5290,7 @@ fn check_for_item_unused_imports(&mut self, vi: &ViewItem) {
     // public or private item, we will check the correct thing, dependent on how the import
     // is used.
     fn finalize_import(&mut self, id: NodeId, span: Span) {
-        debug!("finalizing import uses for {}", self.session.codemap.span_to_snippet(span));
+        debug!("finalizing import uses for {}", self.session.codemap().span_to_snippet(span));
 
         if !self.used_imports.contains(&(id, TypeNS)) &&
            !self.used_imports.contains(&(id, ValueNS)) {
@@ -5563,7 +5340,7 @@ fn finalize_import(&mut self, id: NodeId, span: Span) {
 
     /// A somewhat inefficient routine to obtain the name of a module.
     fn module_to_str(&mut self, module_: @Module) -> ~str {
-        let mut idents = ~[];
+        let mut idents = Vec::new();
         let mut current_module = module_;
         loop {
             match current_module.parent_link {
@@ -5584,7 +5361,10 @@ fn module_to_str(&mut self, module_: @Module) -> ~str {
         if idents.len() == 0 {
             return ~"???";
         }
-        return self.idents_to_str(idents.move_rev_iter().collect::<~[ast::Ident]>());
+        return self.idents_to_str(idents.move_iter()
+                                        .rev()
+                                        .collect::<Vec<ast::Ident>>()
+                                        .as_slice());
     }
 
     #[allow(dead_code)]   // useful for debugging
@@ -5593,14 +5373,13 @@ fn dump_module(&mut self, module_: @Module) {
 
         debug!("Children:");
         self.populate_module_if_necessary(module_);
-        let children = module_.children.borrow();
-        for (&name, _) in children.get().iter() {
+        for (&name, _) in module_.children.borrow().iter() {
             debug!("* {}", token::get_name(name));
         }
 
         debug!("Import resolutions:");
         let import_resolutions = module_.import_resolutions.borrow();
-        for (&name, import_resolution) in import_resolutions.get().iter() {
+        for (&name, import_resolution) in import_resolutions.iter() {
             let value_repr;
             match import_resolution.target_for_namespace(ValueNS) {
                 None => { value_repr = ~""; }
@@ -5633,7 +5412,7 @@ pub struct CrateMap {
 }
 
 /// Entry point to crate resolution.
-pub fn resolve_crate(session: Session,
+pub fn resolve_crate(session: &Session,
                      lang_items: @LanguageItems,
                      krate: &Crate)
                   -> CrateMap {