ty::tls::with_opt(|opt_tcx| {
if let Some(tcx) = opt_tcx {
- if let Some(def_path) = tcx.opt_def_path(*self) {
- write!(f, " => {}", def_path.to_string(tcx))?;
- }
+ write!(f, " => {}", tcx.def_path(*self).to_string(tcx))?;
}
Ok(())
})?;
path_data: &[DisambiguatedDefPathData])
-> Option<DefId>;
fn def_key(&self, def: DefId) -> DefKey;
- fn relative_def_path(&self, def: DefId) -> Option<hir_map::DefPath>;
+ fn def_path(&self, def: DefId) -> hir_map::DefPath;
fn struct_field_names(&self, def: DefId) -> Vec<ast::Name>;
fn item_children(&self, did: DefId) -> Vec<def::Export>;
fn load_macro(&self, did: DefId, sess: &Session) -> LoadedMacro;
}
fn def_key(&self, def: DefId) -> DefKey { bug!("def_key") }
- fn relative_def_path(&self, def: DefId) -> Option<hir_map::DefPath> {
+ fn def_path(&self, def: DefId) -> hir_map::DefPath {
bug!("relative_def_path")
}
fn struct_field_names(&self, def: DefId) -> Vec<ast::Name> { bug!("struct_field_names") }
/// Convert a `DefId` into its fully expanded `DefPath` (every
/// `DefId` is really just an interned def-path).
///
- /// Note that if `id` is not local to this crate -- or is
- /// inlined into this crate -- the result will be a non-local
- /// `DefPath`.
- ///
- /// This function is only safe to use when you are sure that the
- /// full def-path is accessible. Examples that are known to be
- /// safe are local def-ids or items; see `opt_def_path` for more
- /// details.
+ /// Note that if `id` is not local to this crate, the result will
+ // be a non-local `DefPath`.
pub fn def_path(self, id: DefId) -> ast_map::DefPath {
- self.opt_def_path(id).unwrap_or_else(|| {
- bug!("could not load def-path for {:?}", id)
- })
- }
-
- /// Convert a `DefId` into its fully expanded `DefPath` (every
- /// `DefId` is really just an interned def-path).
- ///
- /// When going across crates, we do not save the full info for
- /// every cross-crate def-id, and hence we may not always be able
- /// to create a def-path. Therefore, this returns
- /// `Option<DefPath>` to cover that possibility. It will always
- /// return `Some` for local def-ids, however, as well as for
- /// items. The problems arise with "minor" def-ids like those
- /// associated with a pattern, `impl Trait`, or other internal
- /// detail to a fn.
- ///
- /// Note that if `id` is not local to this crate -- or is
- /// inlined into this crate -- the result will be a non-local
- /// `DefPath`.
- pub fn opt_def_path(self, id: DefId) -> Option<ast_map::DefPath> {
if id.is_local() {
- Some(self.map.def_path(id))
+ self.map.def_path(id)
} else {
- self.sess.cstore.relative_def_path(id)
+ self.sess.cstore.def_path(id)
}
}
self.get_crate_data(def.krate).def_key(def.index)
}
- fn relative_def_path(&self, def: DefId) -> Option<DefPath> {
+ fn def_path(&self, def: DefId) -> DefPath {
// See `Note` above in `def_key()` for why this read is
// commented out:
//
use cstore::{self, CrateMetadata, MetadataBlob, NativeLibrary};
use schema::*;
-use rustc::hir::map as hir_map;
-use rustc::hir::map::{DefKey, DefPathData};
+use rustc::hir::map::{DefKey, DefPath, DefPathData};
use rustc::hir;
use rustc::hir::intravisit::IdRange;
ty::TraitDef::new(self.local_def_id(item_id),
data.unsafety,
data.paren_sugar,
- self.def_path(item_id).unwrap().deterministic_hash(tcx))
+ self.def_path(item_id).deterministic_hash(tcx))
}
fn get_variant(&self,
self.def_path_table.def_key(index)
}
- // Returns the path leading to the thing with this `id`. Note that
- // some def-ids don't wind up in the metadata, so `def_path` sometimes
- // returns `None`
- pub fn def_path(&self, id: DefIndex) -> Option<hir_map::DefPath> {
+ // Returns the path leading to the thing with this `id`.
+ pub fn def_path(&self, id: DefIndex) -> DefPath {
debug!("def_path(id={:?})", id);
- if self.is_proc_macro(id) || self.maybe_entry(id).is_some() {
- Some(hir_map::DefPath::make(self.cnum, id, |parent| self.def_key(parent)))
- } else {
- None
- }
+ DefPath::make(self.cnum, id, |parent| self.def_path_table.def_key(parent))
}
/// Imports the codemap from an external crate into the codemap of the crate