syntax: Mod records the span for inner contents.

this is useful when the module item and module contents are defined
from different files (like rustdoc). in most cases the original span
for the module item would be used; in other cases, the span for
module contents is available separately at the `inner` field.
This commit is contained in:
Kang Seonghoon 2014-04-27 05:05:45 +09:00
parent a692e9b123
commit dee21a67b8
6 changed files with 34 additions and 10 deletions

View File

@ -70,6 +70,7 @@ fn fold_mod(cx: &mut Context, m: &ast::Mod) -> ast::Mod {
filter_view_item(cx, a).map(|x| cx.fold_view_item(x))
}).collect();
ast::Mod {
inner: m.inner,
view_items: filtered_view_items,
items: flattened_items
}

View File

@ -143,6 +143,7 @@ impl<'a> fold::Folder for TestHarnessGenerator<'a> {
}
let mod_nomain = ast::Mod {
inner: m.inner,
view_items: m.view_items.clone(),
items: m.items.iter().map(|i| nomain(&self.cx, *i)).collect(),
};
@ -335,6 +336,7 @@ fn mk_test_module(cx: &TestCtxt) -> @ast::Item {
)).unwrap();
let testmod = ast::Mod {
inner: DUMMY_SP,
view_items: view_items,
items: vec!(mainfn, tests),
};

View File

@ -921,8 +921,12 @@ pub struct Method {
#[deriving(Clone, Eq, TotalEq, Encodable, Decodable, Hash)]
pub struct Mod {
pub view_items: Vec<ViewItem> ,
pub items: Vec<@Item> ,
/// A span from the first token past `{` to the last token until `}`.
/// For `mod foo;`, the inner span ranges from the first token
/// to the last token in the external file.
pub inner: Span,
pub view_items: Vec<ViewItem>,
pub items: Vec<@Item>,
}
#[deriving(Clone, Eq, TotalEq, Encodable, Decodable, Hash)]
@ -1165,7 +1169,15 @@ mod test {
fn check_asts_encodable() {
use std::io;
let e = Crate {
module: Mod {view_items: Vec::new(), items: Vec::new()},
module: Mod {
inner: Span {
lo: BytePos(11),
hi: BytePos(19),
expn_info: None,
},
view_items: Vec::new(),
items: Vec::new(),
},
attrs: Vec::new(),
config: Vec::new(),
span: Span {

View File

@ -220,7 +220,7 @@ pub trait AstBuilder {
generics: Generics) -> @ast::Item;
fn item_struct(&self, span: Span, name: Ident, struct_def: ast::StructDef) -> @ast::Item;
fn item_mod(&self, span: Span,
fn item_mod(&self, span: Span, inner_span: Span,
name: Ident, attrs: Vec<ast::Attribute> ,
vi: Vec<ast::ViewItem> , items: Vec<@ast::Item> ) -> @ast::Item;
@ -898,7 +898,7 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
self.item(span, name, Vec::new(), ast::ItemStruct(@struct_def, generics))
}
fn item_mod(&self, span: Span, name: Ident,
fn item_mod(&self, span: Span, inner_span: Span, name: Ident,
attrs: Vec<ast::Attribute> ,
vi: Vec<ast::ViewItem> ,
items: Vec<@ast::Item> ) -> @ast::Item {
@ -907,6 +907,7 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
name,
attrs,
ast::ItemMod(ast::Mod {
inner: inner_span,
view_items: vi,
items: items,
})

View File

@ -654,6 +654,7 @@ pub fn noop_fold_type_method<T: Folder>(m: &TypeMethod, fld: &mut T) -> TypeMeth
pub fn noop_fold_mod<T: Folder>(m: &Mod, folder: &mut T) -> Mod {
ast::Mod {
inner: folder.new_span(m.inner),
view_items: m.view_items
.iter()
.map(|x| folder.fold_view_item(x)).collect(),

View File

@ -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,