mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-15 12:39:31 +03:00
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:
@@ -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
|
||||
}
|
||||
|
||||
@@ -143,6 +143,7 @@ fn nomain(cx: &TestCtxt, item: @ast::Item) -> @ast::Item {
|
||||
}
|
||||
|
||||
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 @@ pub fn main() {
|
||||
)).unwrap();
|
||||
|
||||
let testmod = ast::Mod {
|
||||
inner: DUMMY_SP,
|
||||
view_items: view_items,
|
||||
items: vec!(mainfn, tests),
|
||||
};
|
||||
|
||||
+15
-3
@@ -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 {
|
||||
|
||||
@@ -220,7 +220,7 @@ fn item_struct_poly(&self,
|
||||
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 @@ fn item_struct_poly(&self, span: Span, name: Ident,
|
||||
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 @@ fn item_mod(&self, span: Span, name: Ident,
|
||||
name,
|
||||
attrs,
|
||||
ast::ItemMod(ast::Mod {
|
||||
inner: inner_span,
|
||||
view_items: vi,
|
||||
items: items,
|
||||
})
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -4036,7 +4036,8 @@ fn parse_for_sized(&mut self) -> Sized {
|
||||
// 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 @@ fn parse_mod_items(&mut self,
|
||||
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 @@ fn parse_item_mod(&mut self, outer_attrs: &[Attribute]) -> ItemInfo {
|
||||
} 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 @@ fn eval_src_mod_from_path(&mut self,
|
||||
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 @@ pub fn parse_crate_mod(&mut self) -> Crate {
|
||||
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,
|
||||
|
||||
Reference in New Issue
Block a user