]> git.lizzy.rs Git - rust.git/commitdiff
def_collector and crate reader operate on AST instead of HIR
authorNick Cameron <ncameron@mozilla.com>
Thu, 14 Apr 2016 02:51:21 +0000 (14:51 +1200)
committerNick Cameron <ncameron@mozilla.com>
Tue, 19 Apr 2016 22:13:35 +0000 (10:13 +1200)
And move extern crate reading earlier in the driver

src/librustc/hir/map/def_collector.rs
src/librustc/hir/map/mod.rs
src/librustc_driver/driver.rs
src/librustc_driver/pretty.rs
src/librustc_metadata/creader.rs

index 974791f62bbc4a236ba2a1b2a4d00965ea2b6aa0..a259c5a0f31470b2855831870c82a9b1a2034029 100644 (file)
 
 use super::*;
 
-use hir::*;
-use hir::intravisit::Visitor;
 use hir::def_id::{CRATE_DEF_INDEX, DefId, DefIndex};
-use syntax::ast::{NodeId, CRATE_NODE_ID, DUMMY_NODE_ID};
+
+use syntax::ast::*;
+use syntax::visit;
 
 /// Creates def ids for nodes in the HIR.
 pub struct DefCollector<'ast> {
@@ -80,31 +80,23 @@ fn create_def_with_parent(&mut self,
     }
 }
 
-impl<'ast> Visitor<'ast> for DefCollector<'ast> {
-    /// Because we want to track parent items and so forth, enable
-    /// deep walking so that we walk nested items in the context of
-    /// their outer items.
-    fn visit_nested_item(&mut self, item: ItemId) {
-        debug!("visit_nested_item: {:?}", item);
-        self.visit_item(self.krate.item(item.id))
-    }
-
+impl<'ast> visit::Visitor<'ast> for DefCollector<'ast> {
     fn visit_item(&mut self, i: &'ast Item) {
         debug!("visit_item: {:?}", i);
 
         // Pick the def data. This need not be unique, but the more
         // information we encapsulate into
         let def_data = match i.node {
-            ItemDefaultImpl(..) | ItemImpl(..) =>
+            ItemKind::DefaultImpl(..) | ItemKind::Impl(..) =>
                 DefPathData::Impl,
-            ItemEnum(..) | ItemStruct(..) | ItemTrait(..) |
-            ItemExternCrate(..) | ItemMod(..) | ItemForeignMod(..) |
-            ItemTy(..) =>
-                DefPathData::TypeNs(i.name),
-            ItemStatic(..) | ItemConst(..) | ItemFn(..) =>
-                DefPathData::ValueNs(i.name),
-            ItemUse(..) =>
-                DefPathData::Misc,
+            ItemKind::Enum(..) | ItemKind::Struct(..) | ItemKind::Trait(..) |
+            ItemKind::ExternCrate(..) | ItemKind::Mod(..) | ItemKind::ForeignMod(..) |
+            ItemKind::Ty(..) =>
+                DefPathData::TypeNs(i.ident.name),
+            ItemKind::Static(..) | ItemKind::Const(..) | ItemKind::Fn(..) =>
+                DefPathData::ValueNs(i.ident.name),
+            ItemKind::Mac(..) => DefPathData::MacroDef(i.ident.name),
+            ItemKind::Use(..) => DefPathData::Misc,
         };
 
         let def = self.create_def(i.id, def_data);
@@ -113,21 +105,22 @@ fn visit_item(&mut self, i: &'ast Item) {
         self.parent_def = Some(def);
 
         match i.node {
-            ItemEnum(ref enum_definition, _) => {
+            ItemKind::Enum(ref enum_definition, _) => {
                 for v in &enum_definition.variants {
                     let variant_def_index =
                         self.create_def(v.node.data.id(),
-                                        DefPathData::EnumVariant(v.node.name));
+                                        DefPathData::EnumVariant(v.node.name.name));
 
                     for field in v.node.data.fields() {
-                        self.create_def_with_parent(
-                            Some(variant_def_index),
-                            field.id,
-                            DefPathData::Field(field.name));
+                        if let Some(ident) = field.ident {
+                            self.create_def_with_parent(Some(variant_def_index),
+                                                        field.id,
+                                                        DefPathData::Field(ident.name));
+                        }
                     }
                 }
             }
-            ItemStruct(ref struct_def, _) => {
+            ItemKind::Struct(ref struct_def, _) => {
                 // If this is a tuple-like struct, register the constructor.
                 if !struct_def.is_struct() {
                     self.create_def(struct_def.id(),
@@ -135,37 +128,40 @@ fn visit_item(&mut self, i: &'ast Item) {
                 }
 
                 for field in struct_def.fields() {
-                    self.create_def(field.id, DefPathData::Field(field.name));
+                    if let Some(ident) = field.ident {
+                        self.create_def(field.id, DefPathData::Field(ident.name));
+                    }
                 }
             }
             _ => {}
         }
-        intravisit::walk_item(self, i);
+        visit::walk_item(self, i);
         self.parent_def = parent_def;
     }
 
     fn visit_foreign_item(&mut self, foreign_item: &'ast ForeignItem) {
-        let def = self.create_def(foreign_item.id, DefPathData::ValueNs(foreign_item.name));
+        let def = self.create_def(foreign_item.id, DefPathData::ValueNs(foreign_item.ident.name));
 
         let parent_def = self.parent_def;
         self.parent_def = Some(def);
-        intravisit::walk_foreign_item(self, foreign_item);
+        visit::walk_foreign_item(self, foreign_item);
         self.parent_def = parent_def;
     }
 
     fn visit_generics(&mut self, generics: &'ast Generics) {
         for ty_param in generics.ty_params.iter() {
             self.create_def(ty_param.id,
-                            DefPathData::TypeParam(ty_param.name));
+                            DefPathData::TypeParam(ty_param.ident.name));
         }
 
-        intravisit::walk_generics(self, generics);
+        visit::walk_generics(self, generics);
     }
 
     fn visit_trait_item(&mut self, ti: &'ast TraitItem) {
         let def_data = match ti.node {
-            MethodTraitItem(..) | ConstTraitItem(..) => DefPathData::ValueNs(ti.name),
-            TypeTraitItem(..) => DefPathData::TypeNs(ti.name),
+            TraitItemKind::Method(..) | TraitItemKind::Const(..) =>
+                DefPathData::ValueNs(ti.ident.name),
+            TraitItemKind::Type(..) => DefPathData::TypeNs(ti.ident.name),
         };
 
         let def = self.create_def(ti.id, def_data);
@@ -174,21 +170,23 @@ fn visit_trait_item(&mut self, ti: &'ast TraitItem) {
         self.parent_def = Some(def);
 
         match ti.node {
-            ConstTraitItem(_, Some(ref expr)) => {
+            TraitItemKind::Const(_, Some(ref expr)) => {
                 self.create_def(expr.id, DefPathData::Initializer);
             }
             _ => { }
         }
 
-        intravisit::walk_trait_item(self, ti);
+        visit::walk_trait_item(self, ti);
 
         self.parent_def = parent_def;
     }
 
     fn visit_impl_item(&mut self, ii: &'ast ImplItem) {
         let def_data = match ii.node {
-            ImplItemKind::Method(..) | ImplItemKind::Const(..) => DefPathData::ValueNs(ii.name),
-            ImplItemKind::Type(..) => DefPathData::TypeNs(ii.name),
+            ImplItemKind::Method(..) | ImplItemKind::Const(..) =>
+                DefPathData::ValueNs(ii.ident.name),
+            ImplItemKind::Type(..) => DefPathData::TypeNs(ii.ident.name),
+            ImplItemKind::Macro(..) => DefPathData::MacroDef(ii.ident.name),
         };
 
         let def = self.create_def(ii.id, def_data);
@@ -203,7 +201,7 @@ fn visit_impl_item(&mut self, ii: &'ast ImplItem) {
             _ => { }
         }
 
-        intravisit::walk_impl_item(self, ii);
+        visit::walk_impl_item(self, ii);
 
         self.parent_def = parent_def;
     }
@@ -220,28 +218,28 @@ fn visit_pat(&mut self, pat: &'ast Pat) {
             self.parent_def = Some(def);
         }
 
-        intravisit::walk_pat(self, pat);
+        visit::walk_pat(self, pat);
         self.parent_def = parent_def;
     }
 
     fn visit_expr(&mut self, expr: &'ast Expr) {
         let parent_def = self.parent_def;
 
-        if let ExprClosure(..) = expr.node {
+        if let ExprKind::Closure(..) = expr.node {
             let def = self.create_def(expr.id, DefPathData::ClosureExpr);
             self.parent_def = Some(def);
         }
 
-        intravisit::walk_expr(self, expr);
+        visit::walk_expr(self, expr);
         self.parent_def = parent_def;
     }
 
     fn visit_stmt(&mut self, stmt: &'ast Stmt) {
-        intravisit::walk_stmt(self, stmt);
+        visit::walk_stmt(self, stmt);
     }
 
     fn visit_block(&mut self, block: &'ast Block) {
-        intravisit::walk_block(self, block);
+        visit::walk_block(self, block);
     }
 
     fn visit_lifetime_def(&mut self, def: &'ast LifetimeDef) {
@@ -249,6 +247,6 @@ fn visit_lifetime_def(&mut self, def: &'ast LifetimeDef) {
     }
 
     fn visit_macro_def(&mut self, macro_def: &'ast MacroDef) {
-        self.create_def(macro_def.id, DefPathData::MacroDef(macro_def.name));
+        self.create_def(macro_def.id, DefPathData::MacroDef(macro_def.ident.name));
     }
 }
index 70071c224f870c2d806d7c9f80fdce2938a7e651..b1954255278c0f10443c68f0ae6cfe9a662e465f 100644 (file)
 use hir::def_id::{CRATE_DEF_INDEX, DefId};
 
 use syntax::abi::Abi;
-use syntax::ast::{self, Name, NodeId, DUMMY_NODE_ID};
+use syntax::ast::{self, Name, NodeId, DUMMY_NODE_ID};
 use syntax::attr::ThinAttributesExt;
 use syntax::codemap::{Span, Spanned};
+use syntax::visit;
 
 use hir::*;
 use hir::fold::Folder;
@@ -782,10 +783,10 @@ fn new_span(&mut self, span: Span) -> Span {
     }
 }
 
-pub fn collect_definitions<'ast>(forest: &'ast mut Forest) -> Definitions {
-    let mut def_collector = DefCollector::root(&forest.krate);
-    intravisit::walk_crate(&mut def_collector, &forest.krate);
-    def_collector.definitions    
+pub fn collect_definitions<'ast>(krate: &'ast ast::Crate) -> Definitions {
+    let mut def_collector = DefCollector::root(krate);
+    visit::walk_crate(&mut def_collector, krate);
+    def_collector.definitions
 }
 
 pub fn map_crate<'ast>(forest: &'ast mut Forest, definitions: Definitions) -> Map<'ast> {
@@ -842,14 +843,15 @@ pub fn map_decoded_item<'ast, F: FoldOps>(map: &Map<'ast>,
     let ii = map.forest.inlined_items.alloc(ii);
     let ii_parent_id = fld.new_id(DUMMY_NODE_ID);
 
-    let defs = mem::replace(&mut *map.definitions.borrow_mut(), Definitions::new());
-    let mut def_collector = DefCollector::extend(map.krate(),
-                                                 ii_parent_id,
-                                                 parent_def_path.clone(),
-                                                 parent_def_id,
-                                                 defs);
-    ii.visit(&mut def_collector);
-    *map.definitions.borrow_mut() = def_collector.definitions;
+    // TODO need to save defs in metadata :-(
+    // let defs = mem::replace(&mut *map.definitions.borrow_mut(), Definitions::new());
+    // let mut def_collector = DefCollector::extend(map.krate(),
+    //                                              ii_parent_id,
+    //                                              parent_def_path.clone(),
+    //                                              parent_def_id,
+    //                                              defs);
+    // ii.visit(&mut def_collector);
+    // *map.definitions.borrow_mut() = def_collector.definitions;
 
     let mut collector = NodeCollector::extend(map.krate(),
                                               ii,
index d63cf8756325af5c434e28ef897ec019a391bc05..6724c0ed8ebfd81f1053cbf4b86ac00b9f4e4987 100644 (file)
@@ -122,32 +122,22 @@ macro_rules! controller_entry_point {
         let expanded_crate = assign_node_ids(sess, expanded_crate);
         let dep_graph = DepGraph::new(sess.opts.build_dep_graph);
 
-        // TODO
-        // time(sess.time_passes(),
-        //      "external crate/lib resolution",
-        //      || LocalCrateReader::new(sess, &cstore, &defs, &id).read_crates());
-
-        // TODO
-        panic!();
-
-        // TODO CrateMap result
-        // let resolve::CrateMap {
-        //     def_map,
-        //     freevars,
-        //     export_map,
-        //     trait_map,
-        //     glob_map,
-        // } = time(sess.time_passes(),
-        //          "name resolution",
-        //          || resolve::resolve_crate(sess, &hir_map, control.make_glob_map));
+        // Collect defintions for def ids.
+        let defs = time(sess.time_passes(),
+                        "collecting defs",
+                        || hir_map::collect_definitions(&expanded_crate));
+
+        time(sess.time_passes(),
+             "external crate/lib resolution",
+             || LocalCrateReader::new(sess, &cstore, &defs, &expanded_crate, &id)
+                    .read_crates(&dep_graph));
 
         // Lower ast -> hir.
         let lcx = LoweringContext::new(sess, Some(&expanded_crate));
-        let dep_graph = DepGraph::new(sess.opts.build_dep_graph());
-        let mut hir_forest = time(sess.time_passes(),
-                                  "lowering ast -> hir",
-                                  || hir_map::Forest::new(lower_crate(&lcx, &expanded_crate),
-                                                          dep_graph));
+        let hir_forest = &mut time(sess.time_passes(),
+                                   "lowering ast -> hir",
+                                   || hir_map::Forest::new(lower_crate(&lcx, &expanded_crate),
+                                                           dep_graph));
 
         // Discard MTWT tables that aren't required past lowering to HIR.
         if !sess.opts.debugging_opts.keep_mtwt_tables &&
@@ -156,10 +146,6 @@ macro_rules! controller_entry_point {
         }
 
         let arenas = ty::CtxtArenas::new();
-        // Collect defintions for def ids.
-        let defs = time(sess.time_passes(),
-                        "collecting defs",
-                        move || hir_map::collect_defs(hir_forest));
 
         // Construct the HIR map
         let hir_map = time(sess.time_passes(),
@@ -201,10 +187,10 @@ macro_rules! controller_entry_point {
         };
 
         phase_3_run_analysis_passes(sess,
-                                    &cstore,
                                     hir_map,
                                     &arenas,
                                     &id,
+                                    control.make_glob_map,
                                     |tcx, mir_map, analysis, result| {
             {
                 // Eventually, we will want to track plugins.
@@ -759,10 +745,10 @@ fn new_id(&mut self, old_id: ast::NodeId) -> ast::NodeId {
 /// miscellaneous analysis passes on the crate. Return various
 /// structures carrying the results of the analysis.
 pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
-                                               cstore: &CStore,
                                                hir_map: hir_map::Map<'tcx>,
                                                arenas: &'tcx ty::CtxtArenas<'tcx>,
                                                name: &str,
+                                               make_glob_map: resolve::MakeGlobMap,
                                                f: F)
                                                -> Result<R, usize>
     where F: FnOnce(&TyCtxt<'tcx>, Option<MirMap<'tcx>>, ty::CrateAnalysis, CompileResult) -> R
@@ -787,6 +773,16 @@ macro_rules! try_with_f {
         })
     })?;
 
+    let resolve::CrateMap {
+        def_map,
+        freevars,
+        export_map,
+        trait_map,
+        glob_map,
+    } = time(sess.time_passes(),
+             "name resolution",
+             || resolve::resolve_crate(sess, &hir_map, make_glob_map));
+
     let mut analysis = ty::CrateAnalysis {
         export_map: export_map,
         access_levels: AccessLevels::default(),
index 228cb8d75afef07f19edf3ec22216b0bd9b7d711..2e3a477e0484050ec5cf9db731d7a4c48564b6ae 100644 (file)
@@ -179,7 +179,6 @@ fn call_with_pp_support<'tcx, A, B, F>(&self,
     }
     fn call_with_pp_support_hir<'tcx, A, B, F>(&self,
                                                sess: &'tcx Session,
-                                               cstore: &CStore,
                                                ast_map: &hir_map::Map<'tcx>,
                                                arenas: &'tcx ty::CtxtArenas<'tcx>,
                                                id: &str,
@@ -206,7 +205,6 @@ fn call_with_pp_support_hir<'tcx, A, B, F>(&self,
             }
             PpmTyped => {
                 abort_on_err(driver::phase_3_run_analysis_passes(sess,
-                                                                 cstore,
                                                                  ast_map.clone(),
                                                                  arenas,
                                                                  id,
@@ -737,9 +735,9 @@ pub fn pretty_print_input(sess: Session,
     let dep_graph = DepGraph::new(false);
     let _ignore = dep_graph.in_ignore();
     let ast_map = if compute_ast_map {
+        let defs = hir_map::collect_definitions(&krate);
         hir_forest = hir_map::Forest::new(lower_crate(&lcx, &krate), dep_graph.clone());
-        let defs = hir_map::collect_defs(hir_forest);
-        let map = hir_map::map_crate(hir_forest, defs);
+        let map = hir_map::map_crate(&mut hir_forest, defs);
         Some(map)
     } else {
         None
@@ -778,7 +776,6 @@ pub fn pretty_print_input(sess: Session,
         (PpmHir(s), None) => {
             let out: &mut Write = &mut out;
             s.call_with_pp_support_hir(&sess,
-                                       cstore,
                                        &ast_map.unwrap(),
                                        &arenas,
                                        &id,
@@ -800,7 +797,6 @@ pub fn pretty_print_input(sess: Session,
         (PpmHir(s), Some(uii)) => {
             let out: &mut Write = &mut out;
             s.call_with_pp_support_hir(&sess,
-                                       cstore,
                                        &ast_map.unwrap(),
                                        &arenas,
                                        &id,
@@ -841,7 +837,6 @@ pub fn pretty_print_input(sess: Session,
                 None
             };
             abort_on_err(driver::phase_3_run_analysis_passes(&sess,
-                                                             &cstore,
                                                              ast_map,
                                                              &arenas,
                                                              &id,
@@ -888,7 +883,6 @@ pub fn pretty_print_input(sess: Session,
                 Some(code) => {
                     let variants = gather_flowgraph_variants(&sess);
                     abort_on_err(driver::phase_3_run_analysis_passes(&sess,
-                                                                     &cstore,
                                                                      ast_map,
                                                                      &arenas,
                                                                      &id,
index 8ec238f4b248f6e60de3cb5f5f1bc129d9bb9c64..4ba59a3d7ebe98dedc2def62d0624e70cc76cff9 100644 (file)
@@ -18,7 +18,7 @@
 use loader::{self, CratePaths};
 
 use rustc::hir::svh::Svh;
-use rustc::dep_graph::DepNode;
+use rustc::dep_graph::{DepGraph, DepNode};
 use rustc::session::{config, Session};
 use rustc::session::search_paths::PathKind;
 use rustc::middle::cstore::{CrateStore, validate_crate_name, ExternCrate};
 use syntax::attr;
 use syntax::attr::AttrMetaMethods;
 use syntax::parse::token::InternedString;
-use rustc::hir::intravisit::Visitor;
-use rustc::hir;
+use syntax::visit;
 use log;
 
-pub struct LocalCrateReader<'a, 'b:'a> {
+pub struct LocalCrateReader<'a> {
     sess: &'a Session,
     cstore: &'a CStore,
     creader: CrateReader<'a>,
-    ast_map: &'a hir_map::Map<'b>,
+    krate: &'a ast::Crate,
+    defintions: &'a hir_map::Definitions,
 }
 
 pub struct CrateReader<'a> {
@@ -56,8 +56,8 @@ pub struct CrateReader<'a> {
     local_crate_name: String,
 }
 
-impl<'a, 'b, 'hir> Visitor<'hir> for LocalCrateReader<'a, 'b> {
-    fn visit_item(&mut self, a: &'hir hir::Item) {
+impl<'a, 'ast> visit::Visitor<'ast> for LocalCrateReader<'a> {
+    fn visit_item(&mut self, a: &'ast ast::Item) {
         self.process_item(a);
     }
 }
@@ -80,10 +80,6 @@ fn dump_crates(cstore: &CStore) {
 fn should_link(i: &ast::Item) -> bool {
     !attr::contains_name(&i.attrs, "no_link")
 }
-// Dup for the hir
-fn should_link_hir(i: &hir::Item) -> bool {
-    !attr::contains_name(&i.attrs, "no_link")
-}
 
 struct CrateInfo {
     ident: String,
@@ -181,31 +177,6 @@ fn extract_crate_info(&self, i: &ast::Item) -> Option<CrateInfo> {
         }
     }
 
-    // Dup of the above, but for the hir
-    fn extract_crate_info_hir(&self, i: &hir::Item) -> Option<CrateInfo> {
-        match i.node {
-            hir::ItemExternCrate(ref path_opt) => {
-                debug!("resolving extern crate stmt. ident: {} path_opt: {:?}",
-                       i.name, path_opt);
-                let name = match *path_opt {
-                    Some(name) => {
-                        validate_crate_name(Some(self.sess), &name.as_str(),
-                                            Some(i.span));
-                        name.to_string()
-                    }
-                    None => i.name.to_string(),
-                };
-                Some(CrateInfo {
-                    ident: i.name.to_string(),
-                    name: name,
-                    id: i.id,
-                    should_link: should_link_hir(i),
-                })
-            }
-            _ => None
-        }
-    }
-
     fn existing_match(&self, name: &str, hash: Option<&Svh>, kind: PathKind)
                       -> Option<ast::CrateNum> {
         let mut ret = None;
@@ -776,29 +747,30 @@ fn validate(me: &CrateReader, krate: ast::CrateNum,
     }
 }
 
-impl<'a, 'b> LocalCrateReader<'a, 'b> {
+impl<'a> LocalCrateReader<'a> {
     pub fn new(sess: &'a Session,
                cstore: &'a CStore,
-               map: &'a hir_map::Map<'b>,
+               defs: &'a hir_map::Definitions,
+               krate: &'a ast::Crate,
                local_crate_name: &str)
-               -> LocalCrateReader<'a, 'b> {
+               -> LocalCrateReader<'a> {
         LocalCrateReader {
             sess: sess,
             cstore: cstore,
             creader: CrateReader::new(sess, cstore, local_crate_name),
-            ast_map: map,
+            krate: krate,
+            defintions: defs,
         }
     }
 
     // Traverses an AST, reading all the information about use'd crates and
     // extern libraries necessary for later resolving, typechecking, linking,
     // etc.
-    pub fn read_crates(&mut self) {
-        let _task = self.ast_map.dep_graph.in_task(DepNode::CrateReader);
-        let krate = self.ast_map.krate();
+    pub fn read_crates(&mut self, dep_graph: &DepGraph) {
+        let _task = dep_graph.in_task(DepNode::CrateReader);
 
-        self.process_crate(krate);
-        krate.visit_all_items(self);
+        self.process_crate(self.krate);
+        visit::walk_crate(self, self.krate);
         self.creader.inject_allocator_crate();
 
         if log_enabled!(log::INFO) {
@@ -811,7 +783,7 @@ pub fn read_crates(&mut self) {
         self.creader.register_statically_included_foreign_items();
     }
 
-    fn process_crate(&self, c: &hir::Crate) {
+    fn process_crate(&self, c: &ast::Crate) {
         for a in c.attrs.iter().filter(|m| m.name() == "link_args") {
             if let Some(ref linkarg) = a.value_str() {
                 self.cstore.add_used_link_args(&linkarg);
@@ -819,14 +791,14 @@ fn process_crate(&self, c: &hir::Crate) {
         }
     }
 
-    fn process_item(&mut self, i: &hir::Item) {
+    fn process_item(&mut self, i: &ast::Item) {
         match i.node {
-            hir::ItemExternCrate(_) => {
-                if !should_link_hir(i) {
+            ast::ItemKind::ExternCrate(_) => {
+                if !should_link(i) {
                     return;
                 }
 
-                match self.creader.extract_crate_info_hir(i) {
+                match self.creader.extract_crate_info(i) {
                     Some(info) => {
                         let (cnum, _, _) = self.creader.resolve_crate(&None,
                                                                       &info.ident,
@@ -835,9 +807,9 @@ fn process_item(&mut self, i: &hir::Item) {
                                                                       i.span,
                                                                       PathKind::Crate,
                                                                       true);
-                        let def_id = self.ast_map.local_def_id(i.id);
+                        let def_id = self.defintions.opt_local_def_id(i.id).unwrap();
 
-                        let len = self.ast_map.def_path(def_id).data.len();
+                        let len = self.defintions.def_path(def_id.index).data.len();
 
                         self.creader.update_extern_crate(cnum,
                                                          ExternCrate {
@@ -851,12 +823,12 @@ fn process_item(&mut self, i: &hir::Item) {
                     None => ()
                 }
             }
-            hir::ItemForeignMod(ref fm) => self.process_foreign_mod(i, fm),
+            ast::ItemKind::ForeignMod(ref fm) => self.process_foreign_mod(i, fm),
             _ => { }
         }
     }
 
-    fn process_foreign_mod(&mut self, i: &hir::Item, fm: &hir::ForeignMod) {
+    fn process_foreign_mod(&mut self, i: &ast::Item, fm: &ast::ForeignMod) {
         if fm.abi == Abi::Rust || fm.abi == Abi::RustIntrinsic || fm.abi == Abi::PlatformIntrinsic {
             return;
         }