about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDaniel Henry-Mantilla <daniel.henry.mantilla@gmail.com>2021-01-06 16:46:47 +0100
committerDaniel Henry-Mantilla <daniel.henry.mantilla@gmail.com>2021-01-06 17:39:36 +0100
commit0311fe98e026579cd3581b7655e9ff84d4376682 (patch)
tree68002560063bd0f9dddaae2a7e6c09ac5c520b9f
parenta4de27aeec7a8c876cce56561598898313a5a6bf (diff)
downloadrust-0311fe98e026579cd3581b7655e9ff84d4376682.tar.gz
rust-0311fe98e026579cd3581b7655e9ff84d4376682.zip
Fix rebase and clean up some code.
-rw-r--r--src/librustdoc/visit_ast.rs30
1 files changed, 8 insertions, 22 deletions
diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs
index 2dc9c7bc758..c559949f01e 100644
--- a/src/librustdoc/visit_ast.rs
+++ b/src/librustdoc/visit_ast.rs
@@ -93,38 +93,24 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
             });
             // HACK: rustdoc has no way to lookup `doctree::Module`s by their HirId. Instead,
             // lookup the module by its name, by looking at each path segment one at a time.
-            // Once #80415 is merged, this whole `for` loop research can be replaced by that.
             let mut cur_mod = &mut top_level_module;
             for path_segment in macro_parent_module.data {
+                // Path segments may refer to a module (in which case they belong to the type
+                // namespace), which is _necessary_ for the macro to be accessible outside it
+                // (no "associated macros" as of yet). Else we bail with an outer `continue`.
                 let path_segment_ty_ns = match path_segment.data {
                     rustc_hir::definitions::DefPathData::TypeNs(symbol) => symbol,
-                    _ => {
-                        // If the path segment is not from the type namespace
-                        // (_e.g._, it can be from a value namespace in the case of `f::` in:
-                        // `fn f() { pub macro m() {} }`
-                        // then the item is not accessible, and should thus act as if it didn't
-                        // exist (unless "associated macros" (inside an `impl`) were a thing…).
-                        continue 'exported_macros;
-                    }
+                    _ => continue 'exported_macros,
                 };
-                // The obtained name in the type namespace may belong to something that is not
-                // a `mod`ule (_e.g._, it could be an `enum` with a `pub macro` defined within
-                // the block used for a discriminant.
-                if let Some(child_mod) =
-                    cur_mod.mods.iter_mut().find(|module| module.name == Some(path_segment_ty_ns))
-                {
-                    cur_mod = child_mod;
-                } else {
-                    // If the macro's parent def path is not exclusively made of module
-                    // components, then it is not accessible (c.f. previous `continue`).
-                    continue 'exported_macros;
+                // Descend into the child module that matches this path segment (if any).
+                match cur_mod.mods.iter_mut().find(|child| child.name == Some(path_segment_ty_ns)) {
+                    Some(child_mod) => cur_mod = &mut *child_mod,
+                    None => continue 'exported_macros,
                 }
             }
             cur_mod.macros.push((def, None));
         }
-
         self.cx.renderinfo.get_mut().exact_paths = self.exact_paths;
-
         top_level_module
     }