diff options
| author | Sean McArthur <sean.monstar@gmail.com> | 2015-07-31 22:20:25 -0700 |
|---|---|---|
| committer | Sean McArthur <sean.monstar@gmail.com> | 2015-08-08 11:54:15 -0700 |
| commit | cfcd449c4c36c68541c3389878e3262dac5e4746 (patch) | |
| tree | 9b938e41ecaffb056741c5e55d7afd7d01a82d18 /src/libsyntax | |
| parent | d03456183e85fe7bd465bbe7c8f67885a2528444 (diff) | |
| download | rust-cfcd449c4c36c68541c3389878e3262dac5e4746.tar.gz rust-cfcd449c4c36c68541c3389878e3262dac5e4746.zip | |
rustc: rename multiple imports in a list
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ast.rs | 21 | ||||
| -rw-r--r-- | src/libsyntax/ext/build.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/fold.rs | 10 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 20 | ||||
| -rw-r--r-- | src/libsyntax/print/pprust.rs | 20 | ||||
| -rw-r--r-- | src/libsyntax/visit.rs | 11 |
6 files changed, 65 insertions, 19 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index db173d08308..555a249e368 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -1656,14 +1656,29 @@ pub type Variant = Spanned<Variant_>; #[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug, Copy)] pub enum PathListItem_ { - PathListIdent { name: Ident, id: NodeId }, - PathListMod { id: NodeId } + PathListIdent { + name: Ident, + /// renamed in list, eg `use foo::{bar as baz};` + rename: Option<Ident>, + id: NodeId + }, + PathListMod { + /// renamed in list, eg `use foo::{self as baz};` + rename: Option<Ident>, + id: NodeId + } } impl PathListItem_ { pub fn id(&self) -> NodeId { match *self { - PathListIdent { id, .. } | PathListMod { id } => id + PathListIdent { id, .. } | PathListMod { id, .. } => id + } + } + + pub fn rename(&self) -> Option<Ident> { + match *self { + PathListIdent { rename, .. } | PathListMod { rename, .. } => rename } } } diff --git a/src/libsyntax/ext/build.rs b/src/libsyntax/ext/build.rs index 2061165abd2..771ac85ef19 100644 --- a/src/libsyntax/ext/build.rs +++ b/src/libsyntax/ext/build.rs @@ -1141,7 +1141,7 @@ impl<'a> AstBuilder for ExtCtxt<'a> { fn item_use_list(&self, sp: Span, vis: ast::Visibility, path: Vec<ast::Ident>, imports: &[ast::Ident]) -> P<ast::Item> { let imports = imports.iter().map(|id| { - respan(sp, ast::PathListIdent { name: *id, id: ast::DUMMY_NODE_ID }) + respan(sp, ast::PathListIdent { name: *id, rename: None, id: ast::DUMMY_NODE_ID }) }).collect(); self.item_use(sp, vis, diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index dab6d41df30..418a2cf5a87 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -335,13 +335,17 @@ pub fn noop_fold_view_path<T: Folder>(view_path: P<ViewPath>, fld: &mut T) -> P< path_list_idents.move_map(|path_list_ident| { Spanned { node: match path_list_ident.node { - PathListIdent { id, name } => + PathListIdent { id, name, rename } => PathListIdent { id: fld.new_id(id), + rename: rename, name: name }, - PathListMod { id } => - PathListMod { id: fld.new_id(id) } + PathListMod { id, rename } => + PathListMod { + id: fld.new_id(id), + rename: rename + } }, span: fld.new_span(path_list_ident.span) } diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index e7ab9a73c0f..981d6e1055a 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -573,10 +573,12 @@ impl<'a> Parser<'a> { pub fn parse_path_list_item(&mut self) -> PResult<ast::PathListItem> { let lo = self.span.lo; let node = if try!(self.eat_keyword(keywords::SelfValue)) { - ast::PathListMod { id: ast::DUMMY_NODE_ID } + let rename = try!(self.parse_rename()); + ast::PathListMod { id: ast::DUMMY_NODE_ID, rename: rename } } else { let ident = try!(self.parse_ident()); - ast::PathListIdent { name: ident, id: ast::DUMMY_NODE_ID } + let rename = try!(self.parse_rename()); + ast::PathListIdent { name: ident, rename: rename, id: ast::DUMMY_NODE_ID } }; let hi = self.last_span.hi; Ok(spanned(lo, hi, node)) @@ -5104,8 +5106,8 @@ impl<'a> Parser<'a> { -> PResult<P<Item>> { let crate_name = try!(self.parse_ident()); - let (maybe_path, ident) = if try!(self.eat_keyword(keywords::As)) { - (Some(crate_name.name), try!(self.parse_ident())) + let (maybe_path, ident) = if let Some(ident) = try!(self.parse_rename()) { + (Some(crate_name.name), ident) } else { (None, crate_name) }; @@ -5766,10 +5768,16 @@ impl<'a> Parser<'a> { } }).collect() }; + rename_to = try!(self.parse_rename()).unwrap_or(rename_to); + Ok(P(spanned(lo, self.last_span.hi, ViewPathSimple(rename_to, path)))) + } + + fn parse_rename(&mut self) -> PResult<Option<Ident>> { if try!(self.eat_keyword(keywords::As)) { - rename_to = try!(self.parse_ident()) + self.parse_ident().map(Some) + } else { + Ok(None) } - Ok(P(spanned(lo, self.last_span.hi, ViewPathSimple(rename_to, path)))) } /// Parses a source module as a crate. This is the main diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index f0973e0ba6e..1de922a0428 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -2643,11 +2643,23 @@ impl<'a> State<'a> { } try!(self.commasep(Inconsistent, &idents[..], |s, w| { match w.node { - ast::PathListIdent { name, .. } => { - s.print_ident(name) + ast::PathListIdent { name, rename, .. } => { + try!(s.print_ident(name)); + if let Some(ident) = rename { + try!(space(&mut s.s)); + try!(s.word_space("as")); + try!(s.print_ident(ident)); + } + Ok(()) }, - ast::PathListMod { .. } => { - word(&mut s.s, "self") + ast::PathListMod { rename, .. } => { + try!(word(&mut s.s, "self")); + if let Some(ident) = rename { + try!(space(&mut s.s)); + try!(s.word_space("as")); + try!(s.print_ident(ident)); + } + Ok(()) } } })); diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs index 649052d123c..27d95cbcf5b 100644 --- a/src/libsyntax/visit.rs +++ b/src/libsyntax/visit.rs @@ -233,10 +233,17 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item) { ViewPathList(ref prefix, ref list) => { for id in list { match id.node { - PathListIdent { name, .. } => { + PathListIdent { name, rename, .. } => { visitor.visit_ident(id.span, name); + if let Some(ident) = rename { + visitor.visit_ident(id.span, ident); + } + } + PathListMod { rename, .. } => { + if let Some(ident) = rename { + visitor.visit_ident(id.span, ident); + } } - PathListMod { .. } => () } } |
