diff options
Diffstat (limited to 'src/librustc/middle/entry.rs')
| -rw-r--r-- | src/librustc/middle/entry.rs | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/src/librustc/middle/entry.rs b/src/librustc/middle/entry.rs index a8f746429ba..f6af8b86b5d 100644 --- a/src/librustc/middle/entry.rs +++ b/src/librustc/middle/entry.rs @@ -11,18 +11,21 @@ use driver::session; use driver::session::Session; -use syntax::ast::{Crate, NodeId, Item, ItemFn}; +use syntax::ast::{Crate, Name, NodeId, Item, ItemFn}; use syntax::ast_map; use syntax::attr; use syntax::codemap::Span; -use syntax::parse::token::special_idents; +use syntax::parse::token; use syntax::visit; use syntax::visit::Visitor; -struct EntryContext { +struct EntryContext<'a> { session: Session, - ast_map: ast_map::Map, + ast_map: &'a ast_map::Map, + + // The interned Name for "main". + main_name: Name, // The top-level function called 'main' main_fn: Option<(NodeId, Span)>, @@ -38,13 +41,13 @@ struct EntryContext { non_main_fns: ~[(NodeId, Span)], } -impl Visitor<()> for EntryContext { +impl<'a> Visitor<()> for EntryContext<'a> { fn visit_item(&mut self, item: &Item, _:()) { find_item(item, self); } } -pub fn find_entry_point(session: Session, krate: &Crate, ast_map: ast_map::Map) { +pub fn find_entry_point(session: Session, krate: &Crate, ast_map: &ast_map::Map) { if session.building_library.get() { // No need to find a main function return; @@ -58,6 +61,7 @@ pub fn find_entry_point(session: Session, krate: &Crate, ast_map: ast_map::Map) let mut ctxt = EntryContext { session: session, + main_name: token::intern("main"), ast_map: ast_map, main_fn: None, attr_main_fn: None, @@ -73,27 +77,22 @@ pub fn find_entry_point(session: Session, krate: &Crate, ast_map: ast_map::Map) fn find_item(item: &Item, ctxt: &mut EntryContext) { match item.node { ItemFn(..) => { - if item.ident.name == special_idents::main.name { - { - match ctxt.ast_map.find(item.id) { - Some(ast_map::NodeItem(_, path)) => { - if path.len() == 0 { - // This is a top-level function so can be 'main' - if ctxt.main_fn.is_none() { - ctxt.main_fn = Some((item.id, item.span)); - } else { - ctxt.session.span_err( - item.span, - "multiple 'main' functions"); - } + if item.ident.name == ctxt.main_name { + ctxt.ast_map.with_path(item.id, |mut path| { + if path.len() == 1 { + // This is a top-level function so can be 'main' + if ctxt.main_fn.is_none() { + ctxt.main_fn = Some((item.id, item.span)); } else { - // This isn't main - ctxt.non_main_fns.push((item.id, item.span)); + ctxt.session.span_err( + item.span, + "multiple 'main' functions"); } + } else { + // This isn't main + ctxt.non_main_fns.push((item.id, item.span)); } - _ => unreachable!() - } - } + }); } if attr::contains_name(item.attrs, "main") { |
