Skip to content

Commit df0c6d9

Browse files
committed
save-analysis: emit names of items that a glob import actually imports.
There is also some work here to make resolve a bit more stable - it no longer overwrites a specific import with a glob import. [breaking-change] Import shadowing of single/list imports by globs is now forbidden. An interesting case is where a glob import imports a re-export (`pub use`) of a single import. This still counts as a single import for the purposes of shadowing .You can usually fix any bustage by re-ordering such imports. A single import may still shadow (override) a glob import or the prelude.
1 parent bd3cf4c commit df0c6d9

File tree

11 files changed

+270
-63
lines changed

11 files changed

+270
-63
lines changed

src/librustc/metadata/csearch.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,13 @@ pub fn get_impl_or_trait_item<'tcx>(tcx: &ty::ctxt<'tcx>, def: ast::DefId)
146146
tcx)
147147
}
148148

149+
pub fn get_trait_name(cstore: &cstore::CStore, def: ast::DefId) -> ast::Name {
150+
let cdata = cstore.get_crate_data(def.krate);
151+
decoder::get_trait_name(cstore.intr.clone(),
152+
&*cdata,
153+
def.node)
154+
}
155+
149156
pub fn get_trait_item_name_and_kind(cstore: &cstore::CStore, def: ast::DefId)
150157
-> (ast::Name, def::TraitItemKind) {
151158
let cdata = cstore.get_crate_data(def.krate);

src/librustc/metadata/decoder.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -781,6 +781,14 @@ pub fn get_impl_items(cdata: Cmd, impl_id: ast::NodeId)
781781
impl_items
782782
}
783783

784+
pub fn get_trait_name(intr: Rc<IdentInterner>,
785+
cdata: Cmd,
786+
id: ast::NodeId)
787+
-> ast::Name {
788+
let doc = lookup_item(id, cdata.data());
789+
item_name(&*intr, doc)
790+
}
791+
784792
pub fn get_trait_item_name_and_kind(intr: Rc<IdentInterner>,
785793
cdata: Cmd,
786794
id: ast::NodeId)

src/librustc/middle/ty.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ pub struct CrateAnalysis<'tcx> {
105105
pub ty_cx: ty::ctxt<'tcx>,
106106
pub reachable: NodeSet,
107107
pub name: String,
108+
pub glob_map: Option<middle::resolve::GlobMap>,
108109
}
109110

110111
#[deriving(Copy, PartialEq, Eq, Hash)]

src/librustc_driver/driver.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -342,17 +342,24 @@ pub fn phase_3_run_analysis_passes<'tcx>(sess: Session,
342342
let lang_items = time(time_passes, "language item collection", (), |_|
343343
middle::lang_items::collect_language_items(krate, &sess));
344344

345-
let resolve::CrateMap {
345+
let make_glob_map = match save_analysis(&sess) {
346+
true => middle::resolve::MakeGlobMap::Yes,
347+
false => middle::resolve::MakeGlobMap::No,
348+
};
346349
def_map,
347350
freevars,
348351
capture_mode_map,
349352
export_map,
350353
trait_map,
351354
external_exports,
352-
last_private_map
355+
last_private_map,
356+
glob_map,
353357
} =
354358
time(time_passes, "resolution", (),
355-
|_| resolve::resolve_crate(&sess, &lang_items, krate));
359+
|_| resolve::resolve_crate(&sess,
360+
&lang_items,
361+
krate,
362+
make_glob_map));
356363

357364
// Discard MTWT tables that aren't required past resolution.
358365
syntax::ext::mtwt::clear_tables();
@@ -454,14 +461,19 @@ pub fn phase_3_run_analysis_passes<'tcx>(sess: Session,
454461
public_items: public_items,
455462
reachable: reachable_map,
456463
name: name,
464+
glob_map: glob_map,
457465
}
458466
}
459467

468+
fn save_analysis(sess: &Session) -> bool {
469+
(sess.opts.debugging_opts & config::SAVE_ANALYSIS) != 0
470+
}
471+
460472
pub fn phase_save_analysis(sess: &Session,
461473
krate: &ast::Crate,
462474
analysis: &ty::CrateAnalysis,
463475
odir: &Option<Path>) {
464-
if (sess.opts.debugging_opts & config::SAVE_ANALYSIS) == 0 {
476+
if !save_analysis(sess) {
465477
return;
466478
}
467479
time(sess.time_passes(), "save analysis", krate, |krate|

src/librustc_driver/test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ fn test_env<F>(source_string: &str,
123123
// run just enough stuff to build a tcx:
124124
let lang_items = lang_items::collect_language_items(krate, &sess);
125125
let resolve::CrateMap { def_map, freevars, capture_mode_map, .. } =
126-
resolve::resolve_crate(&sess, &lang_items, krate);
126+
resolve::resolve_crate(&sess, &ast_map, &lang_items, krate, resolve::MakeGlobMap::No);
127127
let named_region_map = resolve_lifetime::krate(&sess, krate, &def_map);
128128
let region_map = region::resolve_crate(&sess, krate);
129129
let stability_index = stability::Index::build(krate);

src/librustc_resolve/check_unused.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,19 @@ use syntax::ast::{ViewPathGlob, ViewPathList, ViewPathSimple};
2828
use syntax::codemap::{Span, DUMMY_SP};
2929
use syntax::visit::{mod, Visitor};
3030

31-
struct UnusedImportCheckVisitor<'a, 'b:'a> {
32-
resolver: &'a mut Resolver<'b>
31+
struct UnusedImportCheckVisitor<'a, 'b:'a, 'tcx:'b> {
32+
resolver: &'a mut Resolver<'b, 'tcx>
3333
}
3434

3535
// Deref and DerefMut impls allow treating UnusedImportCheckVisitor as Resolver.
36-
impl<'a, 'b> Deref<Resolver<'b>> for UnusedImportCheckVisitor<'a, 'b> {
37-
fn deref<'c>(&'c self) -> &'c Resolver<'b> {
36+
impl<'a, 'b, 'tcx> Deref<Resolver<'b, 'tcx>> for UnusedImportCheckVisitor<'a, 'b, 'tcx:'b> {
37+
fn deref<'c>(&'c self) -> &'c Resolver<'b, 'tcx> {
3838
&*self.resolver
3939
}
4040
}
4141

42-
impl<'a, 'b> DerefMut<Resolver<'b>> for UnusedImportCheckVisitor<'a, 'b> {
43-
fn deref_mut<'c>(&'c mut self) -> &'c mut Resolver<'b> {
42+
impl<'a, 'b, 'tcx> DerefMut<Resolver<'b, 'tcx>> for UnusedImportCheckVisitor<'a, 'b, 'tcx:'b> {
43+
fn deref_mut<'c>(&'c mut self) -> &'c mut Resolver<'b, 'tcx> {
4444
&mut *self.resolver
4545
}
4646
}
@@ -104,7 +104,7 @@ impl<'a, 'b> UnusedImportCheckVisitor<'a, 'b> {
104104
}
105105
}
106106

107-
impl<'a, 'b, 'v> Visitor<'v> for UnusedImportCheckVisitor<'a, 'b> {
107+
impl<'a, 'b, 'v, 'tcx> Visitor<'v> for UnusedImportCheckVisitor<'a, 'b, 'tcx> {
108108
fn visit_view_item(&mut self, vi: &ViewItem) {
109109
// Ignore is_public import statements because there's no way to be sure
110110
// whether they're used or not. Also ignore imports with a dummy span

0 commit comments

Comments
 (0)