about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2015-01-24 13:04:39 +0000
committerbors <bors@rust-lang.org>2015-01-24 13:04:39 +0000
commit0430a43d635841db44978bb648e9cf7e7cfa1bba (patch)
tree464206246bbb598ddc22e216ba2888632b44eca7
parent796d00948a890fde67d9f92d1cc6e8c5edc2c879 (diff)
parentf09c680b4cc9cf9dad5cd0a73ed5dba767b5e925 (diff)
downloadrust-0430a43d635841db44978bb648e9cf7e7cfa1bba.tar.gz
rust-0430a43d635841db44978bb648e9cf7e7cfa1bba.zip
Auto merge of #21542 - vadimcn:fix-exported-macro-paths, r=alexcrichton
... so that `super::foo` gets serialized as `super:: foo`, rather than `super :: foo`.
-rw-r--r--src/libsyntax/print/pprust.rs11
-rw-r--r--src/test/auxiliary/macro_with_super_1.rs26
-rw-r--r--src/test/run-pass/macro_with_super_2.rs20
3 files changed, 56 insertions, 1 deletions
diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs
index 42f156d6a11..d1cd7631c82 100644
--- a/src/libsyntax/print/pprust.rs
+++ b/src/libsyntax/print/pprust.rs
@@ -1164,11 +1164,20 @@ impl<'a> State<'a> {
 
     pub fn print_tts(&mut self, tts: &[ast::TokenTree]) -> IoResult<()> {
         try!(self.ibox(0));
+        let mut suppress_space = false;
         for (i, tt) in tts.iter().enumerate() {
-            if i != 0 {
+            if i != 0 && !suppress_space {
                 try!(space(&mut self.s));
             }
             try!(self.print_tt(tt));
+            // There should be no space between the module name and the following `::` in paths,
+            // otherwise imported macros get re-parsed from crate metadata incorrectly (#20701)
+            suppress_space = match tt {
+                &ast::TtToken(_, token::Ident(_, token::ModName)) |
+                &ast::TtToken(_, token::MatchNt(_, _, _, token::ModName)) |
+                &ast::TtToken(_, token::SubstNt(_, token::ModName)) => true,
+                _ => false
+            }
         }
         self.end()
     }
diff --git a/src/test/auxiliary/macro_with_super_1.rs b/src/test/auxiliary/macro_with_super_1.rs
new file mode 100644
index 00000000000..fd2e52bb355
--- /dev/null
+++ b/src/test/auxiliary/macro_with_super_1.rs
@@ -0,0 +1,26 @@
+// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![crate_type = "lib"]
+
+#[macro_export]
+macro_rules! declare {
+    () => (
+        pub fn aaa() {}
+
+        pub mod bbb {
+            use super::aaa;
+
+            pub fn ccc() {
+                aaa();
+            }
+        }
+    )
+}
diff --git a/src/test/run-pass/macro_with_super_2.rs b/src/test/run-pass/macro_with_super_2.rs
new file mode 100644
index 00000000000..5c681b8e6e7
--- /dev/null
+++ b/src/test/run-pass/macro_with_super_2.rs
@@ -0,0 +1,20 @@
+// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// aux-build:macro_with_super_1.rs
+
+#[macro_use]
+extern crate macro_with_super_1;
+
+declare!();
+
+fn main() {
+    bbb::ccc();
+}