about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2022-11-22 20:20:52 +0300
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2022-11-22 20:43:48 +0300
commit24f2ee1efd6ed9bd0c94223c8f196fdc55202804 (patch)
tree4d2a19712f3d223892498d1aa73d46dea405c606
parent6a233b5e2ab6a59bc32f052d9ecf8b89b4bcf030 (diff)
downloadrust-24f2ee1efd6ed9bd0c94223c8f196fdc55202804.tar.gz
rust-24f2ee1efd6ed9bd0c94223c8f196fdc55202804.zip
rustc_metadata: Cleanup to `get_module_children`
to unify proc-macro and non-proc-macro cases in particular.
-rw-r--r--compiler/rustc_metadata/src/rmeta/decoder.rs75
1 files changed, 26 insertions, 49 deletions
diff --git a/compiler/rustc_metadata/src/rmeta/decoder.rs b/compiler/rustc_metadata/src/rmeta/decoder.rs
index 011b8170885..261512aeb44 100644
--- a/compiler/rustc_metadata/src/rmeta/decoder.rs
+++ b/compiler/rustc_metadata/src/rmeta/decoder.rs
@@ -29,7 +29,7 @@ use rustc_session::cstore::{
     CrateSource, ExternCrate, ForeignModule, LinkagePreference, NativeLib,
 };
 use rustc_session::Session;
-use rustc_span::hygiene::{ExpnIndex, MacroKind};
+use rustc_span::hygiene::ExpnIndex;
 use rustc_span::source_map::{respan, Spanned};
 use rustc_span::symbol::{kw, Ident, Symbol};
 use rustc_span::{self, BytePos, ExpnId, Pos, Span, SyntaxContext, DUMMY_SP};
@@ -989,6 +989,21 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
         DiagnosticItems { id_to_name, name_to_id }
     }
 
+    fn get_mod_child(self, id: DefIndex, sess: &Session) -> ModChild {
+        let ident = self.item_ident(id, sess);
+        let kind = self.def_kind(id);
+        let def_id = self.local_def_id(id);
+        let res = Res::Def(kind, def_id);
+        let vis = self.get_visibility(id);
+        let span = self.get_span(id, sess);
+        let macro_rules = match kind {
+            DefKind::Macro(..) => self.root.tables.macro_rules.get(self, id).is_some(),
+            _ => false,
+        };
+
+        ModChild { ident, res, vis, span, macro_rules }
+    }
+
     /// Iterates over all named children of the given module,
     /// including both proper items and reexports.
     /// Module here is understood in name resolution sense - it can be a `mod` item,
@@ -1003,48 +1018,20 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
                 // If we are loading as a proc macro, we want to return
                 // the view of this crate as a proc macro crate.
                 if id == CRATE_DEF_INDEX {
-                    for def_index in data.macros.decode(self) {
-                        let raw_macro = self.raw_proc_macro(def_index);
-                        let res = Res::Def(
-                            DefKind::Macro(macro_kind(raw_macro)),
-                            self.local_def_id(def_index),
-                        );
-                        let ident = self.item_ident(def_index, sess);
-                        yield ModChild {
-                            ident,
-                            res,
-                            vis: ty::Visibility::Public,
-                            span: ident.span,
-                            macro_rules: false,
-                        };
+                    for child_index in data.macros.decode(self) {
+                        yield self.get_mod_child(child_index, sess);
                     }
                 }
-                return;
-            }
-
-            // Iterate over all children.
-            if let Some(children) = self.root.tables.children.get(self, id) {
-                for child_index in children.decode((self, sess)) {
-                    let ident = self.item_ident(child_index, sess);
-                    let kind = self.def_kind(child_index);
-                    let def_id = self.local_def_id(child_index);
-                    let res = Res::Def(kind, def_id);
-                    let vis = self.get_visibility(child_index);
-                    let span = self.get_span(child_index, sess);
-                    let macro_rules = match kind {
-                        DefKind::Macro(..) => {
-                            self.root.tables.macro_rules.get(self, child_index).is_some()
-                        }
-                        _ => false,
-                    };
-
-                    yield ModChild { ident, res, vis, span, macro_rules };
+            } else {
+                // Iterate over all children.
+                for child_index in self.root.tables.children.get(self, id).unwrap().decode(self) {
+                    yield self.get_mod_child(child_index, sess);
                 }
-            }
 
-            if let Some(exports) = self.root.tables.module_reexports.get(self, id) {
-                for exp in exports.decode((self, sess)) {
-                    yield exp;
+                if let Some(reexports) = self.root.tables.module_reexports.get(self, id) {
+                    for reexport in reexports.decode((self, sess)) {
+                        yield reexport;
+                    }
                 }
             }
         })
@@ -1784,13 +1771,3 @@ impl CrateMetadata {
         None
     }
 }
-
-// Cannot be implemented on 'ProcMacro', as libproc_macro
-// does not depend on librustc_ast
-fn macro_kind(raw: &ProcMacro) -> MacroKind {
-    match raw {
-        ProcMacro::CustomDerive { .. } => MacroKind::Derive,
-        ProcMacro::Attr { .. } => MacroKind::Attr,
-        ProcMacro::Bang { .. } => MacroKind::Bang,
-    }
-}