- P(spanned(lo,
- self.last_span.hi,
- ViewPathSimple(rename_to, path, ast::DUMMY_NODE_ID)))
- }
-
- /// Parses a sequence of items. Stops when it finds program
- /// text that can't be parsed as an item
- /// - mod_items uses extern_mod_allowed = true
- /// - block_tail_ uses extern_mod_allowed = false
- fn parse_items_and_view_items(&mut self,
- first_item_attrs: Vec<Attribute> ,
- mut extern_mod_allowed: bool,
- macros_allowed: bool)
- -> ParsedItemsAndViewItems {
- let mut attrs = first_item_attrs;
- attrs.push_all(&self.parse_outer_attributes()[]);
- // First, parse view items.
- let mut view_items : Vec<ast::ViewItem> = Vec::new();
- let mut items = Vec::new();
-
- // I think this code would probably read better as a single
- // loop with a mutable three-state-variable (for extern crates,
- // view items, and regular items) ... except that because
- // of macros, I'd like to delay that entire check until later.
- loop {
- match self.parse_item_or_view_item(attrs, macros_allowed) {
- IoviNone(attrs) => {
- return ParsedItemsAndViewItems {
- attrs_remaining: attrs,
- view_items: view_items,
- items: items,
- foreign_items: Vec::new()
- }
- }
- IoviViewItem(view_item) => {
- match view_item.node {
- ViewItemUse(..) => {
- // `extern crate` must precede `use`.
- extern_mod_allowed = false;
- }
- ViewItemExternCrate(..) if !extern_mod_allowed => {
- self.span_err(view_item.span,
- "\"extern crate\" declarations are \
- not allowed here");
- }
- ViewItemExternCrate(..) => {}
- }
- view_items.push(view_item);
- }
- IoviItem(item) => {
- items.push(item);
- attrs = self.parse_outer_attributes();
- break;
- }
- IoviForeignItem(_) => {
- panic!();
- }
- }
- attrs = self.parse_outer_attributes();
- }
-
- // Next, parse items.
- loop {
- match self.parse_item_or_view_item(attrs, macros_allowed) {
- IoviNone(returned_attrs) => {
- attrs = returned_attrs;
- break
- }
- IoviViewItem(view_item) => {
- attrs = self.parse_outer_attributes();
- self.span_err(view_item.span,
- "`use` and `extern crate` declarations must precede items");
- }
- IoviItem(item) => {
- attrs = self.parse_outer_attributes();
- items.push(item)
- }
- IoviForeignItem(_) => {
- panic!();
- }
- }
- }
-
- ParsedItemsAndViewItems {
- attrs_remaining: attrs,
- view_items: view_items,
- items: items,
- foreign_items: Vec::new()
- }