Skip to content

Commit

Permalink
map create numbers between compilations
Browse files Browse the repository at this point in the history
  • Loading branch information
mikhail-m1 committed Sep 13, 2016
1 parent b2799a5 commit da3c6b7
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 15 deletions.
17 changes: 10 additions & 7 deletions src/librustc/ty/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ use hir::TraitMap;
use hir::def::DefMap;
use hir::def_id::{DefId, DefIndex};
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;
Expand Down Expand Up @@ -538,8 +538,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: ast::CrateNum,
path_data: &[DisambiguatedDefPathData])
-> Option<DefId> {
debug!("retrace_path(path={:?}, krate={:?})", path_data, self.crate_name(krate));

let root_key = DefKey {
parent: None,
Expand All @@ -549,22 +552,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,
Expand Down
28 changes: 20 additions & 8 deletions src/librustc_incremental/persist/directory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ use rustc::util::nodemap::DefIdMap;
use std::fmt::{self, Debug};
use std::iter::once;
use syntax::ast;
use std::collections::HashMap;

/// Index into the DefIdDirectory
#[derive(Copy, Clone, Debug, PartialOrd, Ord, Hash, PartialEq, Eq,
Expand Down Expand Up @@ -92,18 +93,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
}
})
Expand Down
14 changes: 14 additions & 0 deletions src/test/incremental/change_crate_order/auxiliary/a.rs
Original file line number Diff line number Diff line change
@@ -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;

14 changes: 14 additions & 0 deletions src/test/incremental/change_crate_order/auxiliary/b.rs
Original file line number Diff line number Diff line change
@@ -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;

34 changes: 34 additions & 0 deletions src/test/incremental/change_crate_order/main.rs
Original file line number Diff line number Diff line change
@@ -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;
}

0 comments on commit da3c6b7

Please sign in to comment.