Skip to content

Track whether module declarations are inline (fixes #12590) #52319

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Sep 27, 2018
2 changes: 2 additions & 0 deletions src/libsyntax/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1841,6 +1841,8 @@ pub struct Mod {
/// to the last token in the external file.
pub inner: Span,
pub items: Vec<P<Item>>,
/// For `mod foo;` inline is false, for `mod foo { .. }` it is true.
pub inline: bool,
}

/// Foreign module declaration.
Expand Down
1 change: 1 addition & 0 deletions src/libsyntax/ext/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1101,6 +1101,7 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
ast::ItemKind::Mod(ast::Mod {
inner: inner_span,
items,
inline: true
})
)
}
Expand Down
1 change: 1 addition & 0 deletions src/libsyntax/ext/expand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
krate.module = ast::Mod {
inner: orig_mod_span,
items: vec![],
inline: true,
};
},
_ => unreachable!(),
Expand Down
4 changes: 3 additions & 1 deletion src/libsyntax/fold.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1036,10 +1036,11 @@ pub fn noop_fold_fn_header<T: Folder>(mut header: FnHeader, folder: &mut T) -> F
header
}

pub fn noop_fold_mod<T: Folder>(Mod {inner, items}: Mod, folder: &mut T) -> Mod {
pub fn noop_fold_mod<T: Folder>(Mod {inner, items, inline}: Mod, folder: &mut T) -> Mod {
Mod {
inner: folder.new_span(inner),
items: items.move_flat_map(|x| folder.fold_item(x)),
inline: inline,
}
}

Expand Down Expand Up @@ -1069,6 +1070,7 @@ pub fn noop_fold_crate<T: Folder>(Crate {module, attrs, span}: Crate,
None => (ast::Mod {
inner: span,
items: vec![],
inline: true,
}, vec![], span)
};

Expand Down
17 changes: 12 additions & 5 deletions src/libsyntax/parse/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6252,6 +6252,7 @@ impl<'a> Parser<'a> {
Ok(ast::Mod {
inner: inner_lo.to(hi),
items,
inline: true
})
}

Expand Down Expand Up @@ -6289,6 +6290,7 @@ impl<'a> Parser<'a> {
self.submod_path(id, &outer_attrs, id_span)?;
let (module, mut attrs) =
self.eval_src_mod(path, directory_ownership, id.to_string(), id_span)?;
// Record that we fetched the mod from an external file
if warn {
let attr = Attribute {
id: attr::mk_attr_id(),
Expand All @@ -6301,9 +6303,13 @@ impl<'a> Parser<'a> {
attr::mark_known(&attr);
attrs.push(attr);
}
Ok((id, module, Some(attrs)))
Ok((id, ItemKind::Mod(module), Some(attrs)))
} else {
let placeholder = ast::Mod { inner: syntax_pos::DUMMY_SP, items: Vec::new() };
let placeholder = ast::Mod {
inner: syntax_pos::DUMMY_SP,
items: Vec::new(),
inline: false
};
Ok((id, ItemKind::Mod(placeholder), None))
}
} else {
Expand Down Expand Up @@ -6503,7 +6509,7 @@ impl<'a> Parser<'a> {
directory_ownership: DirectoryOwnership,
name: String,
id_sp: Span)
-> PResult<'a, (ast::ItemKind, Vec<Attribute> )> {
-> PResult<'a, (ast::Mod, Vec<Attribute> )> {
let mut included_mod_stack = self.sess.included_mod_stack.borrow_mut();
if let Some(i) = included_mod_stack.iter().position(|p| *p == path) {
let mut err = String::from("circular modules: ");
Expand All @@ -6523,9 +6529,10 @@ impl<'a> Parser<'a> {
p0.cfg_mods = self.cfg_mods;
let mod_inner_lo = p0.span;
let mod_attrs = p0.parse_inner_attributes()?;
let m0 = p0.parse_mod_items(&token::Eof, mod_inner_lo)?;
let mut m0 = p0.parse_mod_items(&token::Eof, mod_inner_lo)?;
m0.inline = false;
self.sess.included_mod_stack.borrow_mut().pop();
Ok((ast::ItemKind::Mod(m0), mod_attrs))
Ok((m0, mod_attrs))
}

/// Parse a function declaration from a foreign module
Expand Down
26 changes: 20 additions & 6 deletions src/libsyntax/print/pprust.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ pub struct State<'a> {
cur_cmnt: usize,
boxes: Vec<pp::Breaks>,
ann: &'a (dyn PpAnn+'a),
is_expanded: bool
}

fn rust_printer<'a>(writer: Box<dyn Write+'a>, ann: &'a dyn PpAnn) -> State<'a> {
Expand All @@ -72,6 +73,7 @@ fn rust_printer<'a>(writer: Box<dyn Write+'a>, ann: &'a dyn PpAnn) -> State<'a>
cur_cmnt: 0,
boxes: Vec::new(),
ann,
is_expanded: false
}
}

Expand Down Expand Up @@ -133,14 +135,17 @@ impl<'a> State<'a> {
// If the code is post expansion, don't use the table of
// literals, since it doesn't correspond with the literals
// in the AST anymore.
if is_expanded { None } else { Some(lits) })
if is_expanded { None } else { Some(lits) },
is_expanded
)
}

pub fn new(cm: &'a SourceMap,
out: Box<dyn Write+'a>,
ann: &'a dyn PpAnn,
comments: Option<Vec<comments::Comment>>,
literals: Option<Vec<comments::Literal>>) -> State<'a> {
literals: Option<Vec<comments::Literal>>,
is_expanded: bool) -> State<'a> {
State {
s: pp::mk_printer(out, DEFAULT_COLUMNS),
cm: Some(cm),
Expand All @@ -149,6 +154,7 @@ impl<'a> State<'a> {
cur_cmnt: 0,
boxes: Vec::new(),
ann,
is_expanded: is_expanded
}
}
}
Expand Down Expand Up @@ -1260,10 +1266,18 @@ impl<'a> State<'a> {
ast::ItemKind::Mod(ref _mod) => {
self.head(&visibility_qualified(&item.vis, "mod"))?;
self.print_ident(item.ident)?;
self.nbsp()?;
self.bopen()?;
self.print_mod(_mod, &item.attrs)?;
self.bclose(item.span)?;

if _mod.inline || self.is_expanded {
self.nbsp()?;
self.bopen()?;
self.print_mod(_mod, &item.attrs)?;
self.bclose(item.span)?;
} else {
self.s.word(";")?;
self.end()?; // end inner head-block
self.end()?; // end outer head-block
}

}
ast::ItemKind::ForeignMod(ref nmod) => {
self.head("extern")?;
Expand Down
1 change: 1 addition & 0 deletions src/libsyntax/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,7 @@ fn mk_reexport_mod(cx: &mut TestCtxt,
})).collect();

let reexport_mod = ast::Mod {
inline: true,
inner: DUMMY_SP,
items,
};
Expand Down
17 changes: 17 additions & 0 deletions src/test/pretty/issue_12590_a.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// Copyright 2012 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.

// pp-exact

// The next line should not be expanded

mod issue_12590_b;

fn main() { }
14 changes: 14 additions & 0 deletions src/test/pretty/issue_12590_b.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// Copyright 2012 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.

// Second part of two file test
fn b() { }

fn main() { }
28 changes: 28 additions & 0 deletions src/test/pretty/issue_12590_c.pp
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#![feature(prelude_import)]
#![no_std]
#[prelude_import]
use ::std::prelude::v1::*;
#[macro_use]
extern crate std;
// Copyright 2012 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.

// pretty-compare-only
// pretty-mode:expanded
// pp-exact:issue_12590_c.pp

// The next line should be expanded

mod issue_12590_b {

fn b() { }
fn main() { }
}
fn main() { }
19 changes: 19 additions & 0 deletions src/test/pretty/issue_12590_c.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// Copyright 2012 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.

// pretty-compare-only
// pretty-mode:expanded
// pp-exact:issue_12590_c.pp

// The next line should be expanded

mod issue_12590_b;

fn main() { }
30 changes: 25 additions & 5 deletions src/tools/compiletest/src/runtest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,11 @@ struct DebuggerCommands {
breakpoint_lines: Vec<usize>,
}

enum ReadFrom {
Path,
Stdin(String),
}

impl<'test> TestCx<'test> {
/// Code executed for each revision in turn (or, if there are no
/// revisions, exactly once, with revision == None).
Expand Down Expand Up @@ -421,8 +426,14 @@ impl<'test> TestCx<'test> {
round, self.revision
),
);
let proc_res = self.print_source(srcs[round].to_owned(), &self.props.pretty_mode);
let read_from = if round == 0 {
ReadFrom::Path
} else {
ReadFrom::Stdin(srcs[round].to_owned())
};

let proc_res = self.print_source(read_from,
&self.props.pretty_mode);
if !proc_res.status.success() {
self.fatal_proc_rec(
&format!(
Expand Down Expand Up @@ -477,7 +488,7 @@ impl<'test> TestCx<'test> {
}

// additionally, run `--pretty expanded` and try to build it.
let proc_res = self.print_source(srcs[round].clone(), "expanded");
let proc_res = self.print_source(ReadFrom::Path, "expanded");
if !proc_res.status.success() {
self.fatal_proc_rec("pretty-printing (expanded) failed", &proc_res);
}
Expand All @@ -495,12 +506,16 @@ impl<'test> TestCx<'test> {
}
}

fn print_source(&self, src: String, pretty_type: &str) -> ProcRes {
fn print_source(&self, read_from: ReadFrom, pretty_type: &str) -> ProcRes {
let aux_dir = self.aux_output_dir_name();
let input: &str = match read_from {
ReadFrom::Stdin(_) => "-",
ReadFrom::Path => self.testpaths.file.to_str().unwrap(),
};

let mut rustc = Command::new(&self.config.rustc_path);
rustc
.arg("-")
.arg(input)
.args(&["-Z", &format!("unpretty={}", pretty_type)])
.args(&["--target", &self.config.target])
.arg("-L")
Expand All @@ -509,11 +524,16 @@ impl<'test> TestCx<'test> {
.args(&self.props.compile_flags)
.envs(self.props.exec_env.clone());

let src = match read_from {
ReadFrom::Stdin(src) => Some(src),
ReadFrom::Path => None
};

self.compose_and_run(
rustc,
self.config.compile_lib_path.to_str().unwrap(),
Some(aux_dir.to_str().unwrap()),
Some(src),
src,
)
}

Expand Down