Skip to content

Commit 3119d18

Browse files
committed
Disowned the Visitor.
1 parent 4e622be commit 3119d18

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+1038
-1141
lines changed

src/librustc/driver/driver.rs

+15-17
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ pub fn phase_1_parse_input(sess: Session, cfg: ast::CrateConfig, input: &input)
163163
/// standard library and prelude.
164164
pub fn phase_2_configure_and_expand(sess: Session,
165165
cfg: ast::CrateConfig,
166-
mut crate: ast::Crate) -> ast::Crate {
166+
mut crate: ast::Crate)
167+
-> (ast::Crate, syntax::ast_map::map) {
167168
let time_passes = sess.time_passes();
168169

169170
sess.building_library.set(session::building_library(sess.opts, &crate));
@@ -201,10 +202,8 @@ pub fn phase_2_configure_and_expand(sess: Session,
201202
crate = time(time_passes, "std injection", crate, |crate|
202203
front::std_inject::maybe_inject_libstd_ref(sess, crate));
203204

204-
crate = time(time_passes, "assigning node ids", crate, |crate|
205-
front::assign_node_ids::assign_node_ids(sess, crate));
206-
207-
return crate;
205+
time(time_passes, "assinging node ids and indexing ast", crate, |crate|
206+
front::assign_node_ids_and_map::assign_node_ids_and_map(sess, crate))
208207
}
209208

210209
pub struct CrateAnalysis {
@@ -219,13 +218,11 @@ pub struct CrateAnalysis {
219218
/// miscellaneous analysis passes on the crate. Return various
220219
/// structures carrying the results of the analysis.
221220
pub fn phase_3_run_analysis_passes(sess: Session,
222-
crate: &ast::Crate) -> CrateAnalysis {
221+
crate: &ast::Crate,
222+
ast_map: syntax::ast_map::map) -> CrateAnalysis {
223223

224224
let time_passes = sess.time_passes();
225225

226-
let ast_map = time(time_passes, "ast indexing", (), |_|
227-
syntax::ast_map::map_crate(sess.diagnostic(), crate));
228-
229226
time(time_passes, "external crate/lib resolution", (), |_|
230227
creader::read_crates(sess, crate,
231228
session::sess_os_to_meta_os(sess.targ_cfg.os),
@@ -260,8 +257,7 @@ pub fn phase_3_run_analysis_passes(sess: Session,
260257
region_map, lang_items);
261258

262259
// passes are timed inside typeck
263-
let (method_map, vtable_map) = typeck::check_crate(
264-
ty_cx, trait_map, crate);
260+
let (method_map, vtable_map) = typeck::check_crate(ty_cx, trait_map, crate);
265261

266262
// These next two const passes can probably be merged
267263
time(time_passes, "const marking", (), |_|
@@ -489,7 +485,7 @@ pub fn compile_input(sess: Session, cfg: ast::CrateConfig, input: &input,
489485
// large chunks of memory alive and we want to free them as soon as
490486
// possible to keep the peak memory usage low
491487
let (outputs, trans) = {
492-
let expanded_crate = {
488+
let (expanded_crate, ast_map) = {
493489
let crate = phase_1_parse_input(sess, cfg.clone(), input);
494490
if stop_after_phase_1(sess) { return; }
495491
phase_2_configure_and_expand(sess, cfg, crate)
@@ -501,7 +497,7 @@ pub fn compile_input(sess: Session, cfg: ast::CrateConfig, input: &input,
501497

502498
if stop_after_phase_2(sess) { return; }
503499

504-
let analysis = phase_3_run_analysis_passes(sess, &expanded_crate);
500+
let analysis = phase_3_run_analysis_passes(sess, &expanded_crate, ast_map);
505501
if stop_after_phase_3(sess) { return; }
506502
let trans = phase_4_translate_to_llvm(sess, expanded_crate,
507503
&analysis, outputs);
@@ -578,11 +574,12 @@ pub fn pretty_print_input(sess: Session,
578574
ppm: PpMode) {
579575
let crate = phase_1_parse_input(sess, cfg.clone(), input);
580576

581-
let (crate, is_expanded) = match ppm {
577+
let (crate, ast_map, is_expanded) = match ppm {
582578
PpmExpanded | PpmExpandedIdentified | PpmTyped => {
583-
(phase_2_configure_and_expand(sess, cfg, crate), true)
579+
let (crate, ast_map) = phase_2_configure_and_expand(sess, cfg, crate);
580+
(crate, Some(ast_map), true)
584581
}
585-
_ => (crate, false)
582+
_ => (crate, None, false)
586583
};
587584

588585
let annotation = match ppm {
@@ -592,7 +589,8 @@ pub fn pretty_print_input(sess: Session,
592589
} as @pprust::pp_ann
593590
}
594591
PpmTyped => {
595-
let analysis = phase_3_run_analysis_passes(sess, &crate);
592+
let ast_map = ast_map.expect("--pretty=typed missing ast_map");
593+
let analysis = phase_3_run_analysis_passes(sess, &crate, ast_map);
596594
@TypedAnnotation {
597595
analysis: analysis
598596
} as @pprust::pp_ann
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
1+
// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
22
// file at the top-level directory of this distribution and at
33
// http://rust-lang.org/COPYRIGHT.
44
//
@@ -11,22 +11,19 @@
1111
use driver::session::Session;
1212

1313
use syntax::ast;
14-
use syntax::fold::ast_fold;
14+
use syntax::ast_map;
1515

1616
struct NodeIdAssigner {
17-
sess: Session,
17+
sess: Session
1818
}
1919

20-
impl ast_fold for NodeIdAssigner {
21-
fn new_id(&mut self, old_id: ast::NodeId) -> ast::NodeId {
20+
impl ast_map::FoldOps for NodeIdAssigner {
21+
fn new_id(&self, old_id: ast::NodeId) -> ast::NodeId {
2222
assert_eq!(old_id, ast::DUMMY_NODE_ID);
2323
self.sess.next_node_id()
2424
}
2525
}
2626

27-
pub fn assign_node_ids(sess: Session, crate: ast::Crate) -> ast::Crate {
28-
let mut fold = NodeIdAssigner {
29-
sess: sess,
30-
};
31-
fold.fold_crate(crate)
27+
pub fn assign_node_ids_and_map(sess: Session, crate: ast::Crate) -> (ast::Crate, ast_map::map) {
28+
ast_map::map_crate(sess.diagnostic(), crate, NodeIdAssigner { sess: sess })
3229
}

src/librustc/front/feature_gate.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ impl Visitor<()> for Context {
119119
visit::walk_view_item(self, i, ())
120120
}
121121

122-
fn visit_item(&mut self, i: @ast::item, _:()) {
122+
fn visit_item(&mut self, i: &ast::item, _:()) {
123123
for attr in i.attrs.iter() {
124124
if "thread_local" == attr.name() {
125125
self.gate_feature("thread_local", i.span,
@@ -187,7 +187,7 @@ impl Visitor<()> for Context {
187187
visit::walk_ty(self, t, ());
188188
}
189189

190-
fn visit_expr(&mut self, e: @ast::Expr, _: ()) {
190+
fn visit_expr(&mut self, e: &ast::Expr, _: ()) {
191191
match e.node {
192192
ast::ExprUnary(_, ast::UnBox, _) |
193193
ast::ExprVstore(_, ast::ExprVstoreBox) => {

src/librustc/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ pub mod front {
8181
pub mod config;
8282
pub mod test;
8383
pub mod std_inject;
84-
pub mod assign_node_ids;
84+
pub mod assign_node_ids_and_map;
8585
pub mod feature_gate;
8686
}
8787

src/librustc/metadata/creader.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,11 @@ struct ReadCrateVisitor<'a> {
5858
}
5959

6060
impl<'a> visit::Visitor<()> for ReadCrateVisitor<'a> {
61-
fn visit_view_item(&mut self, a:&ast::view_item, _:()) {
61+
fn visit_view_item(&mut self, a: &ast::view_item, _: ()) {
6262
visit_view_item(self.e, a);
6363
visit::walk_view_item(self, a, ());
6464
}
65-
fn visit_item(&mut self, a:@ast::item, _:()) {
65+
fn visit_item(&mut self, a: &ast::item, _: ()) {
6666
visit_item(self.e, a);
6767
visit::walk_item(self, a, ());
6868
}
@@ -164,7 +164,7 @@ fn visit_view_item(e: &mut Env, i: &ast::view_item) {
164164
}
165165
}
166166

167-
fn visit_item(e: &Env, i: @ast::item) {
167+
fn visit_item(e: &Env, i: &ast::item) {
168168
match i.node {
169169
ast::item_foreign_mod(ref fm) => {
170170
if fm.abis.is_rust() || fm.abis.is_intrinsic() {

src/librustc/metadata/encoder.rs

+28-21
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,17 @@ use writer = extra::ebml::writer;
5050
// used by astencode:
5151
type abbrev_map = @RefCell<HashMap<ty::t, tyencode::ty_abbrev>>;
5252

53+
/// A borrowed version of ast::inlined_item.
54+
pub enum InlinedItemRef<'a> {
55+
ii_item_ref(&'a ast::item),
56+
ii_method_ref(ast::DefId, bool, &'a ast::method),
57+
ii_foreign_ref(&'a ast::foreign_item)
58+
}
59+
5360
pub type encode_inlined_item<'a> = 'a |ecx: &EncodeContext,
54-
ebml_w: &mut writer::Encoder,
55-
path: &[ast_map::path_elt],
56-
ii: ast::inlined_item|;
61+
ebml_w: &mut writer::Encoder,
62+
path: &[ast_map::path_elt],
63+
ii: InlinedItemRef|;
5764

5865
pub struct EncodeParams<'a> {
5966
diag: @SpanHandler,
@@ -837,13 +844,13 @@ fn encode_info_for_method(ecx: &EncodeContext,
837844
None => ()
838845
}
839846

840-
for ast_method in ast_method_opt.iter() {
847+
for &ast_method in ast_method_opt.iter() {
841848
let num_params = tpt.generics.type_param_defs.len();
842849
if num_params > 0u || is_default_impl
843850
|| should_inline(ast_method.attrs) {
844851
(ecx.encode_inlined_item)(
845852
ecx, ebml_w, impl_path,
846-
ii_method(local_def(parent_id), false, *ast_method));
853+
ii_method_ref(local_def(parent_id), false, ast_method));
847854
} else {
848855
encode_symbol(ecx, ebml_w, m.def_id.node);
849856
}
@@ -915,13 +922,13 @@ fn encode_extension_implementations(ecx: &EncodeContext,
915922

916923
fn encode_info_for_item(ecx: &EncodeContext,
917924
ebml_w: &mut writer::Encoder,
918-
item: @item,
925+
item: &item,
919926
index: @RefCell<~[entry<i64>]>,
920927
path: &[ast_map::path_elt],
921928
vis: ast::visibility) {
922929
let tcx = ecx.tcx;
923930

924-
fn add_to_index(item: @item, ebml_w: &writer::Encoder,
931+
fn add_to_index(item: &item, ebml_w: &writer::Encoder,
925932
index: @RefCell<~[entry<i64>]>) {
926933
let mut index = index.borrow_mut();
927934
index.get().push(entry {
@@ -958,7 +965,7 @@ fn encode_info_for_item(ecx: &EncodeContext,
958965
}
959966

960967
if !non_inlineable {
961-
(ecx.encode_inlined_item)(ecx, ebml_w, path, ii_item(item));
968+
(ecx.encode_inlined_item)(ecx, ebml_w, path, ii_item_ref(item));
962969
}
963970
encode_visibility(ebml_w, vis);
964971
ebml_w.end_tag();
@@ -974,7 +981,7 @@ fn encode_info_for_item(ecx: &EncodeContext,
974981
encode_path(ecx, ebml_w, path, ast_map::path_name(item.ident));
975982
encode_attributes(ebml_w, item.attrs);
976983
if tps_len > 0u || should_inline(item.attrs) {
977-
(ecx.encode_inlined_item)(ecx, ebml_w, path, ii_item(item));
984+
(ecx.encode_inlined_item)(ecx, ebml_w, path, ii_item_ref(item));
978985
} else {
979986
encode_symbol(ecx, ebml_w, item.id);
980987
}
@@ -1032,7 +1039,7 @@ fn encode_info_for_item(ecx: &EncodeContext,
10321039
for v in (*enum_definition).variants.iter() {
10331040
encode_variant_id(ebml_w, local_def(v.node.id));
10341041
}
1035-
(ecx.encode_inlined_item)(ecx, ebml_w, path, ii_item(item));
1042+
(ecx.encode_inlined_item)(ecx, ebml_w, path, ii_item_ref(item));
10361043
encode_path(ecx, ebml_w, path, ast_map::path_name(item.ident));
10371044

10381045
// Encode inherent implementations for this enumeration.
@@ -1077,7 +1084,7 @@ fn encode_info_for_item(ecx: &EncodeContext,
10771084
needs to know*/
10781085
encode_struct_fields(ecx, ebml_w, struct_def);
10791086

1080-
(ecx.encode_inlined_item)(ecx, ebml_w, path, ii_item(item));
1087+
(ecx.encode_inlined_item)(ecx, ebml_w, path, ii_item_ref(item));
10811088

10821089
// Encode inherent implementations for this structure.
10831090
encode_inherent_implementations(ecx, ebml_w, def_id);
@@ -1272,7 +1279,7 @@ fn encode_info_for_item(ecx: &EncodeContext,
12721279
encode_method_sort(ebml_w, 'p');
12731280
(ecx.encode_inlined_item)(
12741281
ecx, ebml_w, path,
1275-
ii_method(def_id, true, m));
1282+
ii_method_ref(def_id, true, m));
12761283
}
12771284
}
12781285

@@ -1288,7 +1295,7 @@ fn encode_info_for_item(ecx: &EncodeContext,
12881295

12891296
fn encode_info_for_foreign_item(ecx: &EncodeContext,
12901297
ebml_w: &mut writer::Encoder,
1291-
nitem: @foreign_item,
1298+
nitem: &foreign_item,
12921299
index: @RefCell<~[entry<i64>]>,
12931300
path: &ast_map::path,
12941301
abi: AbiSet) {
@@ -1309,7 +1316,7 @@ fn encode_info_for_foreign_item(ecx: &EncodeContext,
13091316
&lookup_item_type(ecx.tcx,local_def(nitem.id)));
13101317
encode_name(ecx, ebml_w, nitem.ident);
13111318
if abi.is_intrinsic() {
1312-
(ecx.encode_inlined_item)(ecx, ebml_w, *path, ii_foreign(nitem));
1319+
(ecx.encode_inlined_item)(ecx, ebml_w, *path, ii_foreign_ref(nitem));
13131320
} else {
13141321
encode_symbol(ecx, ebml_w, nitem.id);
13151322
}
@@ -1331,9 +1338,9 @@ fn encode_info_for_foreign_item(ecx: &EncodeContext,
13311338
ebml_w.end_tag();
13321339
}
13331340

1334-
fn my_visit_expr(_e:@Expr) { }
1341+
fn my_visit_expr(_e: &Expr) { }
13351342

1336-
fn my_visit_item(i: @item,
1343+
fn my_visit_item(i: &item,
13371344
items: ast_map::map,
13381345
ebml_w: &mut writer::Encoder,
13391346
ecx_ptr: *int,
@@ -1352,7 +1359,7 @@ fn my_visit_item(i: @item,
13521359
}
13531360
}
13541361

1355-
fn my_visit_foreign_item(ni: @foreign_item,
1362+
fn my_visit_foreign_item(ni: &foreign_item,
13561363
items: ast_map::map,
13571364
ebml_w: &mut writer::Encoder,
13581365
ecx_ptr:*int,
@@ -1391,19 +1398,19 @@ struct EncodeVisitor<'a,'b> {
13911398
}
13921399

13931400
impl<'a,'b> visit::Visitor<()> for EncodeVisitor<'a,'b> {
1394-
fn visit_expr(&mut self, ex:@Expr, _:()) {
1401+
fn visit_expr(&mut self, ex: &Expr, _: ()) {
13951402
visit::walk_expr(self, ex, ());
13961403
my_visit_expr(ex);
13971404
}
1398-
fn visit_item(&mut self, i:@item, _:()) {
1405+
fn visit_item(&mut self, i: &item, _: ()) {
13991406
visit::walk_item(self, i, ());
14001407
my_visit_item(i,
14011408
self.items,
14021409
self.ebml_w_for_visit_item,
14031410
self.ecx_ptr,
14041411
self.index);
14051412
}
1406-
fn visit_foreign_item(&mut self, ni:@foreign_item, _:()) {
1413+
fn visit_foreign_item(&mut self, ni: &foreign_item, _: ()) {
14071414
visit::walk_foreign_item(self, ni, ());
14081415
my_visit_foreign_item(ni,
14091416
self.items,
@@ -1692,7 +1699,7 @@ struct ImplVisitor<'a,'b> {
16921699
}
16931700

16941701
impl<'a,'b> Visitor<()> for ImplVisitor<'a,'b> {
1695-
fn visit_item(&mut self, item: @item, _: ()) {
1702+
fn visit_item(&mut self, item: &item, _: ()) {
16961703
match item.node {
16971704
item_impl(_, Some(ref trait_ref), _, _) => {
16981705
let def_map = self.ecx.tcx.def_map;

0 commit comments

Comments
 (0)