From 27a261be3ee99664c1f05eb1a17ec9e384da6d7b Mon Sep 17 00:00:00 2001 From: Vadim Chugunov Date: Thu, 22 Jan 2015 17:34:31 -0800 Subject: [PATCH 1/3] Suppress space after idents with "ModName" style in serialization of exported macros. Fixes issue #20701 --- src/libsyntax/print/pprust.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index 42f156d6a11..dbe4241b8e6 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 (issue #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() } From 5c344d3ea8f590739af7ea8b35028a64baf8b296 Mon Sep 17 00:00:00 2001 From: Vadim Chugunov Date: Thu, 22 Jan 2015 23:05:02 -0800 Subject: [PATCH 2/3] Added test. --- src/test/auxiliary/macro_with_super_1.rs | 26 ++++++++++++++++++++++++ src/test/run-pass/macro_with_super_2.rs | 20 ++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 src/test/auxiliary/macro_with_super_1.rs create mode 100644 src/test/run-pass/macro_with_super_2.rs 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..ac50be06ef7 --- /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 or the MIT license +// , 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 or the MIT license +// , 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(); +} From f09c680b4cc9cf9dad5cd0a73ed5dba767b5e925 Mon Sep 17 00:00:00 2001 From: Vadim Chugunov Date: Fri, 23 Jan 2015 11:27:16 -0800 Subject: [PATCH 3/3] Fix tidy. --- src/libsyntax/print/pprust.rs | 2 +- src/test/auxiliary/macro_with_super_1.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index dbe4241b8e6..d1cd7631c82 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -1171,7 +1171,7 @@ impl<'a> State<'a> { } 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 (issue #20701) + // 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)) | diff --git a/src/test/auxiliary/macro_with_super_1.rs b/src/test/auxiliary/macro_with_super_1.rs index ac50be06ef7..fd2e52bb355 100644 --- a/src/test/auxiliary/macro_with_super_1.rs +++ b/src/test/auxiliary/macro_with_super_1.rs @@ -11,7 +11,7 @@ #![crate_type = "lib"] #[macro_export] -macro_rules! declare { +macro_rules! declare { () => ( pub fn aaa() {}