Skip to content

Commit 5599df0

Browse files
committed
---
yaml --- r: 218353 b: refs/heads/master c: 374af4a h: refs/heads/master i: 218351: 5769f1a v: v3
1 parent ff5165b commit 5599df0

File tree

4 files changed

+148
-87
lines changed

4 files changed

+148
-87
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 84cb4ad96994dd8a0dd0d8827834526b0184ca82
2+
refs/heads/master: 374af4aea7878127ca52cbc271fb1237b4afe223
33
refs/heads/snap-stage3: ba0e1cd8147d452c356aacb29fb87568ca26f111
44
refs/heads/try: b53c0f93eedcdedd4fd89bccc5a3a09d1c5cd23e
55
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105

trunk/src/librustc_trans/save/dump_csv.rs

Lines changed: 45 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
//! DumpCsvVisitor walks the AST and processes it.
2929
3030

31-
use super::{escape, generated_code, recorder, SaveContext, PathCollector};
31+
use super::{escape, generated_code, recorder, SaveContext, PathCollector, Data};
3232

3333
use session::Session;
3434

@@ -738,90 +738,51 @@ impl <'l, 'tcx> DumpCsvVisitor<'l, 'tcx> {
738738

739739
fn process_path(&mut self,
740740
id: NodeId,
741-
span: Span,
742741
path: &ast::Path,
743742
ref_kind: Option<recorder::Row>) {
744-
if generated_code(span) {
745-
return
743+
if generated_code(path.span) {
744+
return;
746745
}
747746

748-
let def_map = self.tcx.def_map.borrow();
749-
if !def_map.contains_key(&id) {
750-
self.sess.span_bug(span,
751-
&format!("def_map has no key for {} in visit_expr", id));
752-
}
753-
let def = def_map.get(&id).unwrap().full_def();
754-
let sub_span = self.span.span_for_last_ident(span);
755-
match def {
756-
def::DefUpvar(..) |
757-
def::DefLocal(..) |
758-
def::DefStatic(..) |
759-
def::DefConst(..) |
760-
def::DefAssociatedConst(..) |
761-
def::DefVariant(..) => self.fmt.ref_str(ref_kind.unwrap_or(recorder::VarRef),
762-
span,
763-
sub_span,
764-
def.def_id(),
765-
self.cur_scope),
766-
def::DefStruct(def_id) => self.fmt.ref_str(recorder::TypeRef,
767-
span,
768-
sub_span,
769-
def_id,
770-
self.cur_scope),
771-
def::DefTy(def_id, _) => self.fmt.ref_str(recorder::TypeRef,
772-
span,
773-
sub_span,
774-
def_id,
775-
self.cur_scope),
776-
def::DefMethod(declid, provenence) => {
777-
let sub_span = self.span.sub_span_for_meth_name(span);
778-
let defid = if declid.krate == ast::LOCAL_CRATE {
779-
let ti = self.tcx.impl_or_trait_item(declid);
780-
match provenence {
781-
def::FromTrait(def_id) => {
782-
Some(self.tcx.trait_items(def_id)
783-
.iter()
784-
.find(|mr| {
785-
mr.name() == ti.name()
786-
})
787-
.unwrap()
788-
.def_id())
789-
}
790-
def::FromImpl(def_id) => {
791-
let impl_items = self.tcx.impl_items.borrow();
792-
Some(impl_items.get(&def_id)
793-
.unwrap()
794-
.iter()
795-
.find(|mr| {
796-
self.tcx.impl_or_trait_item(mr.def_id()).name()
797-
== ti.name()
798-
})
799-
.unwrap()
800-
.def_id())
801-
}
802-
}
803-
} else {
804-
None
805-
};
806-
self.fmt.meth_call_str(span,
807-
sub_span,
808-
defid,
809-
Some(declid),
810-
self.cur_scope);
811-
},
812-
def::DefFn(def_id, _) => {
813-
self.fmt.fn_call_str(span,
814-
sub_span,
815-
def_id,
816-
self.cur_scope)
747+
let path_data = self.save_ctxt.get_path_data(id, path);
748+
match path_data {
749+
Data::VariableRefData(ref vrd) => {
750+
self.fmt.ref_str(ref_kind.unwrap_or(recorder::VarRef),
751+
path.span,
752+
Some(vrd.span),
753+
vrd.ref_id,
754+
vrd.scope);
755+
756+
}
757+
Data::TypeRefData(ref trd) => {
758+
self.fmt.ref_str(recorder::TypeRef,
759+
path.span,
760+
Some(trd.span),
761+
trd.ref_id,
762+
trd.scope);
763+
}
764+
Data::MethodCallData(ref mcd) => {
765+
self.fmt.meth_call_str(path.span,
766+
Some(mcd.span),
767+
mcd.ref_id,
768+
mcd.decl_id,
769+
mcd.scope);
770+
}
771+
Data::FunctionCallData(fcd) => {
772+
self.fmt.fn_call_str(path.span,
773+
Some(fcd.span),
774+
fcd.ref_id,
775+
fcd.scope);
776+
}
777+
_ => {
778+
self.sess.span_bug(path.span,
779+
&format!("Unexpected data: {:?}", path_data));
817780
}
818-
_ => self.sess.span_bug(span,
819-
&format!("Unexpected def kind while looking \
820-
up path in `{}`: `{:?}`",
821-
self.span.snippet(span),
822-
def)),
823781
}
824-
// modules or types in the path prefix
782+
783+
// Modules or types in the path prefix.
784+
let def_map = self.tcx.def_map.borrow();
785+
let def = def_map.get(&id).unwrap().full_def();
825786
match def {
826787
def::DefMethod(did, _) => {
827788
let ti = self.tcx.impl_or_trait_item(did);
@@ -1187,7 +1148,7 @@ impl<'l, 'tcx, 'v> Visitor<'v> for DumpCsvVisitor<'l, 'tcx> {
11871148
visit::walk_expr(self, ex);
11881149
}
11891150
ast::ExprPath(_, ref path) => {
1190-
self.process_path(ex.id, path.span, path, None);
1151+
self.process_path(ex.id, path, None);
11911152
visit::walk_expr(self, ex);
11921153
}
11931154
ast::ExprStruct(ref path, ref fields, ref base) =>
@@ -1283,6 +1244,7 @@ impl<'l, 'tcx, 'v> Visitor<'v> for DumpCsvVisitor<'l, 'tcx> {
12831244

12841245
// This is to get around borrow checking, because we need mut self to call process_path.
12851246
let mut paths_to_process = vec![];
1247+
12861248
// process collected paths
12871249
for &(id, ref p, immut, ref_kind) in &collector.collected_paths {
12881250
let def_map = self.tcx.def_map.borrow();
@@ -1319,11 +1281,12 @@ impl<'l, 'tcx, 'v> Visitor<'v> for DumpCsvVisitor<'l, 'tcx> {
13191281
def)
13201282
}
13211283
}
1284+
13221285
for &(id, ref path, ref_kind) in &paths_to_process {
1323-
self.process_path(id, path.span, path, ref_kind);
1286+
self.process_path(id, path, ref_kind);
13241287
}
13251288
visit::walk_expr_opt(self, &arm.guard);
1326-
self.visit_expr(&*arm.body);
1289+
self.visit_expr(&arm.body);
13271290
}
13281291

13291292
fn visit_stmt(&mut self, s: &ast::Stmt) {

trunk/src/librustc_trans/save/mod.rs

Lines changed: 101 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ pub enum Data {
6161
VariableRefData(VariableRefData),
6262
/// Data for a reference to a type or trait.
6363
TypeRefData(TypeRefData),
64+
/// Data about a function call.
65+
FunctionCallData(FunctionCallData),
6466
/// Data about a method call.
6567
MethodCallData(MethodCallData),
6668
}
@@ -122,7 +124,7 @@ pub struct ImplData {
122124
}
123125

124126
/// Data for the use of some item (e.g., the use of a local variable, which
125-
/// will refere to that variables declaration (by ref_id)).
127+
/// will refer to that variables declaration (by ref_id)).
126128
#[derive(Debug)]
127129
pub struct VariableRefData {
128130
pub name: String,
@@ -139,6 +141,14 @@ pub struct TypeRefData {
139141
pub ref_id: DefId,
140142
}
141143

144+
/// Data about a function call.
145+
#[derive(Debug)]
146+
pub struct FunctionCallData {
147+
pub span: Span,
148+
pub scope: NodeId,
149+
pub ref_id: DefId,
150+
}
151+
142152
/// Data about a method call.
143153
#[derive(Debug)]
144154
pub struct MethodCallData {
@@ -392,20 +402,108 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
392402
ty::TraitContainer(_) => (None, Some(method_id))
393403
};
394404
let sub_span = self.span_utils.sub_span_for_meth_name(expr.span);
405+
let parent = self.tcx.map.get_enclosing_scope(expr.id).unwrap_or(0);
395406
Some(Data::MethodCallData(MethodCallData {
396407
span: sub_span.unwrap(),
397-
scope: self.tcx.map.get_enclosing_scope(expr.id).unwrap_or(0),
408+
scope: parent,
398409
ref_id: def_id,
399-
decl_id: decl_id,
410+
decl_id: decl_id,
400411
}))
401412
}
413+
ast::ExprPath(_, ref path) => {
414+
Some(self.get_path_data(expr.id, path))
415+
}
402416
_ => {
403417
// FIXME
404418
unimplemented!();
405419
}
406420
}
407421
}
408422

423+
pub fn get_path_data(&self,
424+
id: NodeId,
425+
path: &ast::Path)
426+
-> Data {
427+
let def_map = self.tcx.def_map.borrow();
428+
if !def_map.contains_key(&id) {
429+
self.tcx.sess.span_bug(path.span,
430+
&format!("def_map has no key for {} in visit_expr", id));
431+
}
432+
let def = def_map.get(&id).unwrap().full_def();
433+
let sub_span = self.span_utils.span_for_last_ident(path.span);
434+
match def {
435+
def::DefUpvar(..) |
436+
def::DefLocal(..) |
437+
def::DefStatic(..) |
438+
def::DefConst(..) |
439+
def::DefAssociatedConst(..) |
440+
def::DefVariant(..) => {
441+
Data::VariableRefData(VariableRefData {
442+
name: self.span_utils.snippet(sub_span.unwrap()),
443+
span: sub_span.unwrap(),
444+
scope: self.tcx.map.get_enclosing_scope(id).unwrap_or(0),
445+
ref_id: def.def_id(),
446+
})
447+
}
448+
def::DefStruct(def_id) | def::DefTy(def_id, _) => {
449+
Data::TypeRefData(TypeRefData {
450+
span: sub_span.unwrap(),
451+
ref_id: def_id,
452+
scope: self.tcx.map.get_enclosing_scope(id).unwrap_or(0),
453+
})
454+
}
455+
def::DefMethod(decl_id, provenence) => {
456+
let sub_span = self.span_utils.sub_span_for_meth_name(path.span);
457+
let def_id = if decl_id.krate == ast::LOCAL_CRATE {
458+
let ti = self.tcx.impl_or_trait_item(decl_id);
459+
match provenence {
460+
def::FromTrait(def_id) => {
461+
Some(self.tcx.trait_items(def_id)
462+
.iter()
463+
.find(|mr| {
464+
mr.name() == ti.name()
465+
})
466+
.unwrap()
467+
.def_id())
468+
}
469+
def::FromImpl(def_id) => {
470+
let impl_items = self.tcx.impl_items.borrow();
471+
Some(impl_items.get(&def_id)
472+
.unwrap()
473+
.iter()
474+
.find(|mr| {
475+
self.tcx.impl_or_trait_item(mr.def_id()).name()
476+
== ti.name()
477+
})
478+
.unwrap()
479+
.def_id())
480+
}
481+
}
482+
} else {
483+
None
484+
};
485+
Data::MethodCallData(MethodCallData {
486+
span: sub_span.unwrap(),
487+
scope: self.tcx.map.get_enclosing_scope(id).unwrap_or(0),
488+
ref_id: def_id,
489+
decl_id: Some(decl_id),
490+
})
491+
},
492+
def::DefFn(def_id, _) => {
493+
Data::FunctionCallData(FunctionCallData {
494+
ref_id: def_id,
495+
span: sub_span.unwrap(),
496+
scope: self.tcx.map.get_enclosing_scope(id).unwrap_or(0),
497+
})
498+
}
499+
_ => self.tcx.sess.span_bug(path.span,
500+
&format!("Unexpected def kind while looking \
501+
up path in `{}`: `{:?}`",
502+
self.span_utils.snippet(path.span),
503+
def)),
504+
}
505+
}
506+
409507
pub fn get_field_ref_data(&self,
410508
field_ref: &ast::Field,
411509
struct_id: DefId,

trunk/src/libsyntax/ext/expand.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
6161

6262
// Keep going, outside-in.
6363
let fully_expanded = fld.fold_expr(expanded_expr);
64-
let span = fld.new_span(span);
64+
let span = fld.new_span(span);
6565
fld.cx.bt_pop();
6666

6767
fully_expanded.map(|e| ast::Expr {

0 commit comments

Comments
 (0)