Skip to content

Commit e70e48d

Browse files
committed
librustc: Port entry point finding to the new visitor
1 parent 608ae11 commit e70e48d

File tree

1 file changed

+45
-50
lines changed

1 file changed

+45
-50
lines changed

src/librustc/middle/entry.rs

Lines changed: 45 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ use syntax::ast::{Crate, NodeId, item, item_fn};
1515
use syntax::ast_map;
1616
use syntax::attr;
1717
use syntax::codemap::span;
18-
use syntax::oldvisit::{default_visitor, mk_vt, vt, Visitor, visit_crate};
19-
use syntax::oldvisit::{visit_item};
2018
use syntax::parse::token::special_idents;
19+
use syntax::visit::Visitor;
20+
use syntax::visit;
2121
use std::util;
2222

2323
struct EntryContext {
@@ -39,8 +39,6 @@ struct EntryContext {
3939
non_main_fns: ~[(NodeId, span)],
4040
}
4141

42-
type EntryVisitor = vt<@mut EntryContext>;
43-
4442
pub fn find_entry_point(session: Session, crate: &Crate, ast_map: ast_map::map) {
4543

4644
// FIXME #4404 android JNI hacks
@@ -56,75 +54,72 @@ pub fn find_entry_point(session: Session, crate: &Crate, ast_map: ast_map::map)
5654
return
5755
}
5856

59-
let ctxt = @mut EntryContext {
57+
let mut ctxt = EntryContext {
6058
session: session,
6159
ast_map: ast_map,
6260
main_fn: None,
6361
attr_main_fn: None,
6462
start_fn: None,
6563
non_main_fns: ~[],
6664
};
67-
68-
visit_crate(crate, (ctxt, mk_vt(@Visitor {
69-
visit_item: |item, (ctxt, visitor)| find_item(item, ctxt, visitor),
70-
.. *default_visitor()
71-
})));
72-
73-
configure_main(ctxt);
65+
visit::walk_crate(&mut ctxt, crate, ());
66+
configure_main(&mut ctxt);
7467
}
7568

76-
fn find_item(item: @item, ctxt: @mut EntryContext, visitor: EntryVisitor) {
77-
match item.node {
78-
item_fn(*) => {
79-
if item.ident == special_idents::main {
80-
match ctxt.ast_map.find(&item.id) {
81-
Some(&ast_map::node_item(_, path)) => {
82-
if path.len() == 0 {
83-
// This is a top-level function so can be 'main'
84-
if ctxt.main_fn.is_none() {
85-
ctxt.main_fn = Some((item.id, item.span));
69+
impl Visitor<()> for EntryContext {
70+
fn visit_item(&mut self, item: @item, _: ()) {
71+
match item.node {
72+
item_fn(*) => {
73+
if item.ident == special_idents::main {
74+
match self.ast_map.find(&item.id) {
75+
Some(&ast_map::node_item(_, path)) => {
76+
if path.len() == 0 {
77+
// This is a top-level function so can be
78+
// 'main'
79+
if self.main_fn.is_none() {
80+
self.main_fn = Some((item.id, item.span));
81+
} else {
82+
self.session.span_err(
83+
item.span,
84+
"multiple 'main' functions");
85+
}
8686
} else {
87-
ctxt.session.span_err(
88-
item.span,
89-
"multiple 'main' functions");
87+
// This isn't main
88+
self.non_main_fns.push((item.id, item.span));
9089
}
91-
} else {
92-
// This isn't main
93-
ctxt.non_main_fns.push((item.id, item.span));
9490
}
91+
_ => util::unreachable()
9592
}
96-
_ => util::unreachable()
9793
}
98-
}
9994

100-
if attr::contains_name(item.attrs, "main") {
101-
if ctxt.attr_main_fn.is_none() {
102-
ctxt.attr_main_fn = Some((item.id, item.span));
103-
} else {
104-
ctxt.session.span_err(
105-
item.span,
106-
"multiple 'main' functions");
95+
if attr::contains_name(item.attrs, "main") {
96+
if self.attr_main_fn.is_none() {
97+
self.attr_main_fn = Some((item.id, item.span));
98+
} else {
99+
self.session.span_err(
100+
item.span,
101+
"multiple 'main' functions");
102+
}
107103
}
108-
}
109104

110-
if attr::contains_name(item.attrs, "start") {
111-
if ctxt.start_fn.is_none() {
112-
ctxt.start_fn = Some((item.id, item.span));
113-
} else {
114-
ctxt.session.span_err(
115-
item.span,
116-
"multiple 'start' functions");
105+
if attr::contains_name(item.attrs, "start") {
106+
if self.start_fn.is_none() {
107+
self.start_fn = Some((item.id, item.span));
108+
} else {
109+
self.session.span_err(
110+
item.span,
111+
"multiple 'start' functions");
112+
}
117113
}
118114
}
115+
_ => ()
119116
}
120-
_ => ()
121-
}
122117

123-
visit_item(item, (ctxt, visitor));
118+
visit::walk_item(self, item, ());
119+
}
124120
}
125121

126-
fn configure_main(ctxt: @mut EntryContext) {
127-
let this = &mut *ctxt;
122+
fn configure_main(this: &mut EntryContext) {
128123
if this.start_fn.is_some() {
129124
*this.session.entry_fn = this.start_fn;
130125
*this.session.entry_type = Some(session::EntryStart);

0 commit comments

Comments
 (0)