pub use self::LangItem::*;
+use front::map as hir_map;
use session::Session;
-use metadata::csearch::each_lang_item;
+use middle::cstore::CrateStore;
use middle::def_id::DefId;
use middle::ty;
use middle::weak_lang_items;
use syntax::attr::AttrMetaMethods;
use syntax::codemap::{DUMMY_SP, Span};
use syntax::parse::token::InternedString;
-use rustc_front::visit::Visitor;
-use rustc_front::visit;
+use rustc_front::intravisit::Visitor;
use rustc_front::hir;
use std::iter::Enumerate;
)*
}
-struct LanguageItemCollector<'a> {
+struct LanguageItemCollector<'a, 'tcx: 'a> {
items: LanguageItems,
+ ast_map: &'a hir_map::Map<'tcx>,
+
session: &'a Session,
item_refs: FnvHashMap<&'static str, usize>,
}
-impl<'a, 'v> Visitor<'v> for LanguageItemCollector<'a> {
+impl<'a, 'v, 'tcx> Visitor<'v> for LanguageItemCollector<'a, 'tcx> {
fn visit_item(&mut self, item: &hir::Item) {
if let Some(value) = extract(&item.attrs) {
let item_index = self.item_refs.get(&value[..]).cloned();
if let Some(item_index) = item_index {
- self.collect_item(item_index, DefId::local(item.id), item.span)
+ self.collect_item(item_index, self.ast_map.local_def_id(item.id), item.span)
}
}
-
- visit::walk_item(self, item);
}
}
-impl<'a> LanguageItemCollector<'a> {
- pub fn new(session: &'a Session) -> LanguageItemCollector<'a> {
+impl<'a, 'tcx> LanguageItemCollector<'a, 'tcx> {
+ pub fn new(session: &'a Session, ast_map: &'a hir_map::Map<'tcx>)
+ -> LanguageItemCollector<'a, 'tcx> {
let mut item_refs = FnvHashMap();
$( item_refs.insert($name, $variant as usize); )*
LanguageItemCollector {
session: session,
+ ast_map: ast_map,
items: LanguageItems::new(),
- item_refs: item_refs
+ item_refs: item_refs,
}
}
}
pub fn collect_local_language_items(&mut self, krate: &hir::Crate) {
- visit::walk_crate(self, krate);
+ krate.visit_all_items(self);
}
pub fn collect_external_language_items(&mut self) {
- let crate_store = &self.session.cstore;
- crate_store.iter_crate_data(|crate_number, _crate_metadata| {
- each_lang_item(crate_store, crate_number, |node_id, item_index| {
- let def_id = DefId { krate: crate_number, node: node_id };
+ let cstore = &self.session.cstore;
+ for cnum in cstore.crates() {
+ for (index, item_index) in cstore.lang_items(cnum) {
+ let def_id = DefId { krate: cnum, index: index };
self.collect_item(item_index, def_id, DUMMY_SP);
- true
- });
- })
+ }
+ }
}
pub fn collect(&mut self, krate: &hir::Crate) {
return None;
}
-pub fn collect_language_items(krate: &hir::Crate,
- session: &Session) -> LanguageItems {
- let mut collector = LanguageItemCollector::new(session);
+pub fn collect_language_items(session: &Session,
+ map: &hir_map::Map)
+ -> LanguageItems {
+ let krate: &hir::Crate = map.krate();
+ let mut collector = LanguageItemCollector::new(session, map);
collector.collect(krate);
let LanguageItemCollector { mut items, .. } = collector;
weak_lang_items::check_crate(krate, session, &mut items);
EhUnwindResumeLangItem, "eh_unwind_resume", eh_unwind_resume;
MSVCTryFilterLangItem, "msvc_try_filter", msvc_try_filter;
- ExchangeHeapLangItem, "exchange_heap", exchange_heap;
OwnedBoxLangItem, "owned_box", owned_box;
PhantomDataItem, "phantom_data", phantom_data;