]> git.lizzy.rs Git - rust.git/commitdiff
Add field `parent` to `ImportDirective`.
authorJeffrey Seyfried <jeffrey.seyfried@gmail.com>
Wed, 17 Aug 2016 00:42:14 +0000 (00:42 +0000)
committerJeffrey Seyfried <jeffrey.seyfried@gmail.com>
Thu, 18 Aug 2016 03:13:41 +0000 (03:13 +0000)
src/librustc_resolve/lib.rs
src/librustc_resolve/resolve_imports.rs

index d90a932a63d86081ae540569329326eb1ffe9902..742d955e38a2b28abb013a3a95d3bd25f3f16847 100644 (file)
@@ -756,7 +756,7 @@ pub struct ModuleS<'a> {
 
     no_implicit_prelude: Cell<bool>,
 
-    glob_importers: RefCell<Vec<(Module<'a>, &'a ImportDirective<'a>)>>,
+    glob_importers: RefCell<Vec<&'a ImportDirective<'a>>>,
     globs: RefCell<Vec<&'a ImportDirective<'a>>>,
 
     // Used to memoize the traits in this module for faster searches through all traits in scope.
index a0539206fa42fa6a21559e11567022817fc1f1a7..83b1f64a33a9a063528493288f6d73b9181c5433 100644 (file)
@@ -63,6 +63,7 @@ pub fn single(target: Name, source: Name) -> Self {
 #[derive(Debug,Clone)]
 pub struct ImportDirective<'a> {
     pub id: NodeId,
+    parent: Module<'a>,
     module_path: Vec<Name>,
     target_module: Cell<Option<Module<'a>>>, // the resolution of `module_path`
     subclass: ImportDirectiveSubclass,
@@ -223,6 +224,7 @@ pub fn add_import_directive(&mut self,
                                 id: NodeId,
                                 vis: ty::Visibility) {
         let directive = self.arenas.alloc_import_directive(ImportDirective {
+            parent: self.current_module,
             module_path: module_path,
             target_module: Cell::new(None),
             subclass: subclass,
@@ -306,9 +308,9 @@ fn update_resolution<T, F>(&mut self, module: Module<'a>, name: Name, ns: Namesp
 
         // Define `new_binding` in `module`s glob importers.
         if new_binding.is_importable() && new_binding.is_pseudo_public() {
-            for &(importer, directive) in module.glob_importers.borrow_mut().iter() {
+            for directive in module.glob_importers.borrow_mut().iter() {
                 let imported_binding = self.import(new_binding, directive);
-                let _ = self.try_define(importer, name, ns, imported_binding);
+                let _ = self.try_define(directive.parent, name, ns, imported_binding);
             }
         }
 
@@ -317,8 +319,6 @@ fn update_resolution<T, F>(&mut self, module: Module<'a>, name: Name, ns: Namesp
 }
 
 struct ImportResolvingError<'a> {
-    /// Module where the error happened
-    source_module: Module<'a>,
     import_directive: &'a ImportDirective<'a>,
     span: Span,
     help: String,
@@ -402,9 +402,7 @@ fn resolve_imports(&mut self) {
 
     // Define a "dummy" resolution containing a Def::Err as a placeholder for a
     // failed resolution
-    fn import_dummy_binding(&mut self,
-                            source_module: Module<'b>,
-                            directive: &'b ImportDirective<'b>) {
+    fn import_dummy_binding(&mut self, directive: &'b ImportDirective<'b>) {
         if let SingleImport { target, .. } = directive.subclass {
             let dummy_binding = self.arenas.alloc_name_binding(NameBinding {
                 kind: NameBindingKind::Def(Def::Err),
@@ -413,8 +411,8 @@ fn import_dummy_binding(&mut self,
             });
             let dummy_binding = self.import(dummy_binding, directive);
 
-            let _ = self.try_define(source_module, target, ValueNS, dummy_binding.clone());
-            let _ = self.try_define(source_module, target, TypeNS, dummy_binding);
+            let _ = self.try_define(directive.parent, target, ValueNS, dummy_binding.clone());
+            let _ = self.try_define(directive.parent, target, TypeNS, dummy_binding);
         }
     }
 
@@ -423,7 +421,7 @@ fn import_dummy_binding(&mut self,
     fn import_resolving_error(&mut self, e: ImportResolvingError<'b>) {
         // If the error is a single failed import then create a "fake" import
         // resolution for it so that later resolve stages won't complain.
-        self.import_dummy_binding(e.source_module, e.import_directive);
+        self.import_dummy_binding(e.import_directive);
         let path = import_path_to_string(&e.import_directive.module_path,
                                          &e.import_directive.subclass);
         resolve_error(self.resolver,
@@ -445,7 +443,6 @@ fn resolve_imports_in_current_module(&mut self, errors: &mut Vec<ImportResolving
                         None => (import_directive.span, String::new()),
                     };
                     errors.push(ImportResolvingError {
-                        source_module: self.current_module,
                         import_directive: import_directive,
                         span: span,
                         help: help,
@@ -511,7 +508,7 @@ fn resolve_import(&mut self, directive: &'b ImportDirective<'b>) -> ResolveResul
                         .emit();
                     // Do not import this illegal binding. Import a dummy binding and pretend
                     // everything is fine
-                    self.import_dummy_binding(module, directive);
+                    self.import_dummy_binding(directive);
                     return Success(());
                 }
                 Success(binding) if !self.is_accessible(binding.vis) => {}
@@ -635,7 +632,7 @@ fn resolve_glob_import(&mut self, target_module: Module<'b>, directive: &'b Impo
         }
 
         // Add to target_module's glob_importers
-        target_module.glob_importers.borrow_mut().push((module, directive));
+        target_module.glob_importers.borrow_mut().push(directive);
 
         // Ensure that `resolutions` isn't borrowed during `try_define`,
         // since it might get updated via a glob cycle.