]> git.lizzy.rs Git - rust.git/commitdiff
Pretty print `$crate` as `crate` or `crate_name` in more cases
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Sat, 26 Jan 2019 13:29:34 +0000 (16:29 +0300)
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Sat, 26 Jan 2019 14:11:28 +0000 (17:11 +0300)
src/librustc_resolve/macros.rs
src/librustc_resolve/resolve_imports.rs
src/libsyntax/ext/base.rs
src/libsyntax/ext/expand.rs
src/test/pretty/dollar-crate.pp [new file with mode: 0644]
src/test/pretty/dollar-crate.rs [new file with mode: 0644]

index 286f9a758830b9a740b8133838e9ff22900ed95e..e552795260465de419fd9c2c873c00d812bb81bc 100644 (file)
@@ -15,7 +15,7 @@
 use syntax::attr;
 use syntax::errors::DiagnosticBuilder;
 use syntax::ext::base::{self, Determinacy};
-use syntax::ext::base::{Annotatable, MacroKind, SyntaxExtension};
+use syntax::ext::base::{MacroKind, SyntaxExtension};
 use syntax::ext::expand::{AstFragment, Invocation, InvocationKind};
 use syntax::ext::hygiene::{self, Mark};
 use syntax::ext::tt::macro_rules;
@@ -127,9 +127,9 @@ fn get_module_scope(&mut self, id: ast::NodeId) -> Mark {
         mark
     }
 
-    fn resolve_dollar_crates(&mut self, annotatable: &Annotatable) {
-        pub struct ResolveDollarCrates<'a, 'b: 'a> {
-            pub resolver: &'a mut Resolver<'b>,
+    fn resolve_dollar_crates(&mut self, fragment: &AstFragment) {
+        struct ResolveDollarCrates<'a, 'b: 'a> {
+            resolver: &'a mut Resolver<'b>
         }
         impl<'a> Visitor<'a> for ResolveDollarCrates<'a, '_> {
             fn visit_ident(&mut self, ident: Ident) {
@@ -144,7 +144,7 @@ fn visit_ident(&mut self, ident: Ident) {
             fn visit_mac(&mut self, _: &ast::Mac) {}
         }
 
-        annotatable.visit_with(&mut ResolveDollarCrates { resolver: self });
+        fragment.visit_with(&mut ResolveDollarCrates { resolver: self });
     }
 
     fn visit_ast_fragment_with_placeholders(&mut self, mark: Mark, fragment: &AstFragment,
index fd55897522bf7f2c1595bfe8377186e9fc102161..9a04c9d60b86822d21b4cf165ed09d4e4bd228b4 100644 (file)
@@ -537,11 +537,8 @@ fn ambiguity(&self, kind: AmbiguityKind,
                  primary_binding: &'a NameBinding<'a>, secondary_binding: &'a NameBinding<'a>)
                  -> &'a NameBinding<'a> {
         self.arenas.alloc_name_binding(NameBinding {
-            kind: primary_binding.kind.clone(),
             ambiguity: Some((secondary_binding, kind)),
-            vis: primary_binding.vis,
-            span: primary_binding.span,
-            expansion: primary_binding.expansion,
+            ..primary_binding.clone()
         })
     }
 
index 2793754e1033afac623e321f2c0e435b4e5633ce..09e7e57f78cfa8643f72e658b384db3ec96b4814 100644 (file)
@@ -14,7 +14,6 @@
 use ptr::P;
 use smallvec::SmallVec;
 use symbol::{keywords, Ident, Symbol};
-use visit::Visitor;
 use ThinVec;
 
 use rustc_data_structures::fx::FxHashMap;
@@ -136,17 +135,6 @@ pub fn derive_allowed(&self) -> bool {
             _ => false,
         }
     }
-
-    pub fn visit_with<'a, V: Visitor<'a>>(&'a self, visitor: &mut V) {
-        match self {
-            Annotatable::Item(item) => visitor.visit_item(item),
-            Annotatable::TraitItem(trait_item) => visitor.visit_trait_item(trait_item),
-            Annotatable::ImplItem(impl_item) => visitor.visit_impl_item(impl_item),
-            Annotatable::ForeignItem(foreign_item) => visitor.visit_foreign_item(foreign_item),
-            Annotatable::Stmt(stmt) => visitor.visit_stmt(stmt),
-            Annotatable::Expr(expr) => visitor.visit_expr(expr),
-        }
-    }
 }
 
 // A more flexible ItemDecorator.
@@ -742,7 +730,7 @@ pub trait Resolver {
     fn next_node_id(&mut self) -> ast::NodeId;
     fn get_module_scope(&mut self, id: ast::NodeId) -> Mark;
 
-    fn resolve_dollar_crates(&mut self, annotatable: &Annotatable);
+    fn resolve_dollar_crates(&mut self, fragment: &AstFragment);
     fn visit_ast_fragment_with_placeholders(&mut self, mark: Mark, fragment: &AstFragment,
                                             derives: &[Mark]);
     fn add_builtin(&mut self, ident: ast::Ident, ext: Lrc<SyntaxExtension>);
@@ -776,7 +764,7 @@ impl Resolver for DummyResolver {
     fn next_node_id(&mut self) -> ast::NodeId { ast::DUMMY_NODE_ID }
     fn get_module_scope(&mut self, _id: ast::NodeId) -> Mark { Mark::root() }
 
-    fn resolve_dollar_crates(&mut self, _annotatable: &Annotatable) {}
+    fn resolve_dollar_crates(&mut self, _fragment: &AstFragment) {}
     fn visit_ast_fragment_with_placeholders(&mut self, _invoc: Mark, _fragment: &AstFragment,
                                             _derives: &[Mark]) {}
     fn add_builtin(&mut self, _ident: ast::Ident, _ext: Lrc<SyntaxExtension>) {}
index 9369e66cf83da7368010c9a576da19a2f3d75835..6e327c6a9dadeec5799cc08bdf66d572628ab0d6 100644 (file)
@@ -443,6 +443,9 @@ fn resolve_imports(&mut self) {
     /// prepares data for resolving paths of macro invocations.
     fn collect_invocations(&mut self, fragment: AstFragment, derives: &[Mark])
                            -> (AstFragment, Vec<Invocation>) {
+        // Resolve `$crate`s in the fragment for pretty-printing.
+        self.cx.resolver.resolve_dollar_crates(&fragment);
+
         let (fragment_with_placeholders, invocations) = {
             let mut collector = InvocationCollector {
                 cfg: StripUnconfigured {
@@ -574,8 +577,6 @@ fn expand_attr_invoc(&mut self,
                 Some(invoc.fragment_kind.expect_from_annotatables(items))
             }
             AttrProcMacro(ref mac, ..) => {
-                // Resolve `$crate`s in case we have to go though stringification.
-                self.cx.resolver.resolve_dollar_crates(&item);
                 self.gate_proc_macro_attr_item(attr.span, &item);
                 let item_tok = TokenTree::Token(DUMMY_SP, Token::interpolated(match item {
                     Annotatable::Item(item) => token::NtItem(item),
@@ -917,8 +918,6 @@ fn expand_derive_invoc(&mut self,
 
         match *ext {
             ProcMacroDerive(ref ext, ..) => {
-                // Resolve `$crate`s in case we have to go though stringification.
-                self.cx.resolver.resolve_dollar_crates(&item);
                 invoc.expansion_data.mark.set_expn_info(expn_info);
                 let span = span.with_ctxt(self.cx.backtrace());
                 let dummy = ast::MetaItem { // FIXME(jseyfried) avoid this
diff --git a/src/test/pretty/dollar-crate.pp b/src/test/pretty/dollar-crate.pp
new file mode 100644 (file)
index 0000000..3d2d949
--- /dev/null
@@ -0,0 +1,18 @@
+#![feature(prelude_import)]
+#![no_std]
+#[prelude_import]
+use ::std::prelude::v1::*;
+#[macro_use]
+extern crate std;
+// pretty-compare-only
+// pretty-mode:expanded
+// pp-exact:dollar-crate.pp
+
+fn main() {
+    {
+        ::std::io::_print(::std::fmt::Arguments::new_v1(&["rust\n"],
+                                                        &match () {
+                                                             () => [],
+                                                         }));
+    };
+}
diff --git a/src/test/pretty/dollar-crate.rs b/src/test/pretty/dollar-crate.rs
new file mode 100644 (file)
index 0000000..e46bc7f
--- /dev/null
@@ -0,0 +1,7 @@
+// pretty-compare-only
+// pretty-mode:expanded
+// pp-exact:dollar-crate.pp
+
+fn main() {
+    println!("rust");
+}