Rollup merge of #36460 - mikhail-m1:35123-map3, r=nikomatsakis
map crate numbers between compilations ?r nikomatsakis issue #35123
This commit is contained in:
commit
94622260a8
|
@ -17,7 +17,7 @@ use hir::TraitMap;
|
|||
use hir::def::DefMap;
|
||||
use hir::def_id::{CrateNum, DefId, DefIndex, LOCAL_CRATE};
|
||||
use hir::map as ast_map;
|
||||
use hir::map::{DefKey, DefPath, DefPathData, DisambiguatedDefPathData};
|
||||
use hir::map::{DefKey, DefPathData, DisambiguatedDefPathData};
|
||||
use middle::free_region::FreeRegionMap;
|
||||
use middle::region::RegionMaps;
|
||||
use middle::resolve_lifetime;
|
||||
|
@ -546,8 +546,11 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn retrace_path(self, path: &DefPath) -> Option<DefId> {
|
||||
debug!("retrace_path(path={:?}, krate={:?})", path, self.crate_name(path.krate));
|
||||
pub fn retrace_path(self,
|
||||
krate: CrateNum,
|
||||
path_data: &[DisambiguatedDefPathData])
|
||||
-> Option<DefId> {
|
||||
debug!("retrace_path(path={:?}, krate={:?})", path_data, self.crate_name(krate));
|
||||
|
||||
let root_key = DefKey {
|
||||
parent: None,
|
||||
|
@ -557,22 +560,22 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
|||
},
|
||||
};
|
||||
|
||||
let root_index = self.def_index_for_def_key(path.krate, root_key)
|
||||
let root_index = self.def_index_for_def_key(krate, root_key)
|
||||
.expect("no root key?");
|
||||
|
||||
debug!("retrace_path: root_index={:?}", root_index);
|
||||
|
||||
let mut index = root_index;
|
||||
for data in &path.data {
|
||||
for data in path_data {
|
||||
let key = DefKey { parent: Some(index), disambiguated_data: data.clone() };
|
||||
debug!("retrace_path: key={:?}", key);
|
||||
match self.def_index_for_def_key(path.krate, key) {
|
||||
match self.def_index_for_def_key(krate, key) {
|
||||
Some(i) => index = i,
|
||||
None => return None,
|
||||
}
|
||||
}
|
||||
|
||||
Some(DefId { krate: path.krate, index: index })
|
||||
Some(DefId { krate: krate, index: index })
|
||||
}
|
||||
|
||||
pub fn type_parameter_def(self,
|
||||
|
|
|
@ -20,6 +20,7 @@ use rustc::ty::TyCtxt;
|
|||
use rustc::util::nodemap::DefIdMap;
|
||||
use std::fmt::{self, Debug};
|
||||
use std::iter::once;
|
||||
use std::collections::HashMap;
|
||||
|
||||
/// Index into the DefIdDirectory
|
||||
#[derive(Copy, Clone, Debug, PartialOrd, Ord, Hash, PartialEq, Eq,
|
||||
|
@ -90,18 +91,29 @@ impl DefIdDirectory {
|
|||
}
|
||||
|
||||
pub fn retrace(&self, tcx: TyCtxt) -> RetracedDefIdDirectory {
|
||||
let max_current_crate = self.max_current_crate(tcx);
|
||||
|
||||
fn make_key(name: &str, disambiguator: &str) -> String {
|
||||
format!("{}/{}", name, disambiguator)
|
||||
}
|
||||
|
||||
let new_krates: HashMap<_, _> =
|
||||
once(LOCAL_CRATE)
|
||||
.chain(tcx.sess.cstore.crates())
|
||||
.map(|krate| (make_key(&tcx.crate_name(krate),
|
||||
&tcx.crate_disambiguator(krate)), krate))
|
||||
.collect();
|
||||
|
||||
let ids = self.paths.iter()
|
||||
.map(|path| {
|
||||
if self.krate_still_valid(tcx, max_current_crate, path.krate) {
|
||||
tcx.retrace_path(path)
|
||||
let old_krate_id = path.krate.as_usize();
|
||||
assert!(old_krate_id < self.krates.len());
|
||||
let old_crate_info = &self.krates[old_krate_id];
|
||||
let old_crate_key = make_key(&old_crate_info.name,
|
||||
&old_crate_info.disambiguator);
|
||||
if let Some(&new_crate_key) = new_krates.get(&old_crate_key) {
|
||||
tcx.retrace_path(new_crate_key, &path.data)
|
||||
} else {
|
||||
debug!("crate {} changed from {:?} to {:?}/{:?}",
|
||||
path.krate,
|
||||
self.krates[path.krate.as_usize()],
|
||||
tcx.crate_name(path.krate),
|
||||
tcx.crate_disambiguator(path.krate));
|
||||
debug!("crate {:?} no longer exists", old_crate_key);
|
||||
None
|
||||
}
|
||||
})
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![crate_type="rlib"]
|
||||
|
||||
pub static A : u32 = 32;
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![crate_type="rlib"]
|
||||
|
||||
pub static B: u32 = 32;
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// aux-build:a.rs
|
||||
// aux-build:b.rs
|
||||
// revisions:rpass1 rpass2
|
||||
|
||||
#![feature(rustc_attrs)]
|
||||
|
||||
|
||||
#[cfg(rpass1)]
|
||||
extern crate a;
|
||||
#[cfg(rpass1)]
|
||||
extern crate b;
|
||||
|
||||
#[cfg(rpass2)]
|
||||
extern crate b;
|
||||
#[cfg(rpass2)]
|
||||
extern crate a;
|
||||
|
||||
use a::A;
|
||||
use b::B;
|
||||
|
||||
//? #[rustc_clean(label="TypeckItemBody", cfg="rpass2")]
|
||||
pub fn main() {
|
||||
A + B;
|
||||
}
|
Loading…
Reference in New Issue