about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2018-11-14 02:20:59 +0300
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2018-11-18 13:57:37 +0300
commitf492e9421fdec42b448aeeb54fa9aff0177ba442 (patch)
treec38b1f8e498fa2144f58efb65b6d56436565d147
parent0e8a97f8e7cf1da19c708d33f56027e1d9d9f067 (diff)
downloadrust-f492e9421fdec42b448aeeb54fa9aff0177ba442.tar.gz
rust-f492e9421fdec42b448aeeb54fa9aff0177ba442.zip
resolve: Support resolving macros without leaving traces
-rw-r--r--src/librustc_resolve/macros.rs22
-rw-r--r--src/librustdoc/passes/collect_intra_doc_links.rs2
-rw-r--r--src/test/ui-fulldeps/custom-derive/derive-in-mod.rs13
3 files changed, 28 insertions, 9 deletions
diff --git a/src/librustc_resolve/macros.rs b/src/librustc_resolve/macros.rs
index 14e54631f24..98dcd2988d6 100644
--- a/src/librustc_resolve/macros.rs
+++ b/src/librustc_resolve/macros.rs
@@ -327,7 +327,7 @@ impl<'a, 'crateloader: 'a> base::Resolver for Resolver<'a, 'crateloader> {
         };
 
         let parent_scope = self.invoc_parent_scope(invoc_id, derives_in_scope);
-        let (def, ext) = self.resolve_macro_to_def(path, kind, &parent_scope, force)?;
+        let (def, ext) = self.resolve_macro_to_def(path, kind, &parent_scope, true, force)?;
 
         if let Def::Macro(def_id, _) = def {
             if after_derive {
@@ -350,7 +350,7 @@ impl<'a, 'crateloader: 'a> base::Resolver for Resolver<'a, 'crateloader> {
                           derives_in_scope: Vec<ast::Path>, force: bool)
                           -> Result<Lrc<SyntaxExtension>, Determinacy> {
         let parent_scope = self.invoc_parent_scope(invoc_id, derives_in_scope);
-        Ok(self.resolve_macro_to_def(path, kind, &parent_scope, force)?.1)
+        Ok(self.resolve_macro_to_def(path, kind, &parent_scope, false, force)?.1)
     }
 
     fn check_unused_macros(&self) {
@@ -391,9 +391,10 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
         path: &ast::Path,
         kind: MacroKind,
         parent_scope: &ParentScope<'a>,
+        trace: bool,
         force: bool,
     ) -> Result<(Def, Lrc<SyntaxExtension>), Determinacy> {
-        let def = self.resolve_macro_to_def_inner(path, kind, parent_scope, force);
+        let def = self.resolve_macro_to_def_inner(path, kind, parent_scope, trace, force);
 
         // Report errors and enforce feature gates for the resolved macro.
         if def != Err(Determinacy::Undetermined) {
@@ -465,6 +466,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
         path: &ast::Path,
         kind: MacroKind,
         parent_scope: &ParentScope<'a>,
+        trace: bool,
         force: bool,
     ) -> Result<Def, Determinacy> {
         let path_span = path.span;
@@ -492,8 +494,10 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
                 PathResult::Module(..) => unreachable!(),
             };
 
-            parent_scope.module.multi_segment_macro_resolutions.borrow_mut()
-                .push((path, path_span, kind, parent_scope.clone(), def.ok()));
+            if trace {
+                parent_scope.module.multi_segment_macro_resolutions.borrow_mut()
+                    .push((path, path_span, kind, parent_scope.clone(), def.ok()));
+            }
 
             def
         } else {
@@ -506,8 +510,10 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
                 Err(Determinacy::Undetermined) => return Err(Determinacy::Undetermined),
             }
 
-            parent_scope.module.single_segment_macro_resolutions.borrow_mut()
-                .push((path[0].ident, kind, parent_scope.clone(), binding.ok()));
+            if trace {
+                parent_scope.module.single_segment_macro_resolutions.borrow_mut()
+                    .push((path[0].ident, kind, parent_scope.clone(), binding.ok()));
+            }
 
             binding.map(|binding| binding.def_ignoring_ambiguity())
         }
@@ -634,7 +640,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
                     for derive in &parent_scope.derives {
                         let parent_scope = ParentScope { derives: Vec::new(), ..*parent_scope };
                         match self.resolve_macro_to_def(derive, MacroKind::Derive,
-                                                        &parent_scope, force) {
+                                                        &parent_scope, true, force) {
                             Ok((_, ext)) => {
                                 if let SyntaxExtension::ProcMacroDerive(_, helpers, _) = &*ext {
                                     if helpers.contains(&ident.name) {
diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs
index 471ba6345e2..85c9b6ee728 100644
--- a/src/librustdoc/passes/collect_intra_doc_links.rs
+++ b/src/librustdoc/passes/collect_intra_doc_links.rs
@@ -477,7 +477,7 @@ fn macro_resolve(cx: &DocContext, path_str: &str) -> Option<Def> {
     let mut resolver = cx.resolver.borrow_mut();
     let parent_scope = resolver.dummy_parent_scope();
     if let Ok(def) = resolver.resolve_macro_to_def_inner(&path, MacroKind::Bang,
-                                                         &parent_scope, false) {
+                                                         &parent_scope, false, false) {
         if let SyntaxExtension::DeclMacro { .. } = *resolver.get_macro(def) {
             return Some(def);
         }
diff --git a/src/test/ui-fulldeps/custom-derive/derive-in-mod.rs b/src/test/ui-fulldeps/custom-derive/derive-in-mod.rs
new file mode 100644
index 00000000000..8478ff1a6ae
--- /dev/null
+++ b/src/test/ui-fulldeps/custom-derive/derive-in-mod.rs
@@ -0,0 +1,13 @@
+// compile-pass
+// aux-build:plugin.rs
+
+extern crate plugin;
+
+mod inner {
+    use plugin::WithHelper;
+
+    #[derive(WithHelper)]
+    struct S;
+}
+
+fn main() {}