auto merge of #13791 : lifthrasiir/rust/mod-inner-span, r=huonw
This PR is primarily motivated by (and fixes) #12926. We currently only have a span for the individual item itself and not for the referred contents. This normally does not cause a problem since both are located in the same file; it *is* possible that the contained statement or item is located in the other file (the syntax extension can do that), but even in that case the syntax extension should be located in the same file as the item. The module item (i.e. `mod foo;`) is the only exception here, and thus warrants a special treatment. Rustdoc would now distinguish `mod foo;` from `mod foo {...}` by checking if the span for the module item and module contents is in different files. If it's the case, we'd prefer module contents over module item. There are alternative strategies, but as noted above we will have some corner cases if we don't record the contents span explicitly.
This commit is contained in:
commit
a1ad41b93d
9 changed files with 58 additions and 14 deletions
|
@ -4036,7 +4036,8 @@ impl<'a> Parser<'a> {
|
|||
// attributes (of length 0 or 1), parse all of the items in a module
|
||||
fn parse_mod_items(&mut self,
|
||||
term: token::Token,
|
||||
first_item_attrs: Vec<Attribute> )
|
||||
first_item_attrs: Vec<Attribute>,
|
||||
inner_lo: BytePos)
|
||||
-> Mod {
|
||||
// parse all of the items up to closing or an attribute.
|
||||
// view items are legal here.
|
||||
|
@ -4081,7 +4082,11 @@ impl<'a> Parser<'a> {
|
|||
self.span_err(self.last_span, "expected item after attributes");
|
||||
}
|
||||
|
||||
ast::Mod { view_items: view_items, items: items }
|
||||
ast::Mod {
|
||||
inner: mk_sp(inner_lo, self.span.lo),
|
||||
view_items: view_items,
|
||||
items: items
|
||||
}
|
||||
}
|
||||
|
||||
fn parse_item_const(&mut self) -> ItemInfo {
|
||||
|
@ -4107,8 +4112,9 @@ impl<'a> Parser<'a> {
|
|||
} else {
|
||||
self.push_mod_path(id, outer_attrs);
|
||||
self.expect(&token::LBRACE);
|
||||
let mod_inner_lo = self.span.lo;
|
||||
let (inner, next) = self.parse_inner_attrs_and_next();
|
||||
let m = self.parse_mod_items(token::RBRACE, next);
|
||||
let m = self.parse_mod_items(token::RBRACE, next, mod_inner_lo);
|
||||
self.expect(&token::RBRACE);
|
||||
self.pop_mod_path();
|
||||
(id, ItemMod(m), Some(inner))
|
||||
|
@ -4197,10 +4203,11 @@ impl<'a> Parser<'a> {
|
|||
self.cfg.clone(),
|
||||
&path,
|
||||
id_sp);
|
||||
let mod_inner_lo = p0.span.lo;
|
||||
let (inner, next) = p0.parse_inner_attrs_and_next();
|
||||
let mod_attrs = outer_attrs.append(inner.as_slice());
|
||||
let first_item_outer_attrs = next;
|
||||
let m0 = p0.parse_mod_items(token::EOF, first_item_outer_attrs);
|
||||
let m0 = p0.parse_mod_items(token::EOF, first_item_outer_attrs, mod_inner_lo);
|
||||
self.sess.included_mod_stack.borrow_mut().pop();
|
||||
return (ast::ItemMod(m0), mod_attrs);
|
||||
}
|
||||
|
@ -5061,7 +5068,7 @@ impl<'a> Parser<'a> {
|
|||
let (inner, next) = self.parse_inner_attrs_and_next();
|
||||
let first_item_outer_attrs = next;
|
||||
// parse the items inside the crate:
|
||||
let m = self.parse_mod_items(token::EOF, first_item_outer_attrs);
|
||||
let m = self.parse_mod_items(token::EOF, first_item_outer_attrs, lo);
|
||||
|
||||
ast::Crate {
|
||||
module: m,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue