Skip to content

Commit 1f175fa

Browse files
committed
Hygienize librustc_resolve.
1 parent 1cded84 commit 1f175fa

File tree

18 files changed

+491
-189
lines changed

18 files changed

+491
-189
lines changed

src/librustc/hir/lowering.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ impl<'a> LoweringContext<'a> {
393393
}
394394

395395
fn allow_internal_unstable(&self, reason: &'static str, mut span: Span) -> Span {
396-
let mark = Mark::fresh();
396+
let mark = Mark::fresh(Mark::root());
397397
mark.set_expn_info(codemap::ExpnInfo {
398398
call_site: span,
399399
callee: codemap::NameAndSpan {

src/librustc_metadata/cstore_impl.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ impl CrateStore for cstore::CStore {
388388
attrs: attrs.iter().cloned().collect(),
389389
node: ast::ItemKind::MacroDef(ast::MacroDef {
390390
tokens: body.into(),
391-
legacy: true,
391+
legacy: def.legacy,
392392
}),
393393
vis: ast::Visibility::Inherited,
394394
})

src/librustc_metadata/encoder.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1104,6 +1104,7 @@ impl<'a, 'b: 'a, 'tcx: 'b> IsolatedEncoder<'a, 'b, 'tcx> {
11041104
Entry {
11051105
kind: EntryKind::MacroDef(self.lazy(&MacroDef {
11061106
body: pprust::tts_to_string(&macro_def.body.trees().collect::<Vec<_>>()),
1107+
legacy: macro_def.legacy,
11071108
})),
11081109
visibility: self.lazy(&ty::Visibility::Public),
11091110
span: self.lazy(&macro_def.span),

src/librustc_metadata/schema.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,9 +433,10 @@ impl_stable_hash_for!(struct ModData { reexports });
433433
#[derive(RustcEncodable, RustcDecodable)]
434434
pub struct MacroDef {
435435
pub body: String,
436+
pub legacy: bool,
436437
}
437438

438-
impl_stable_hash_for!(struct MacroDef { body });
439+
impl_stable_hash_for!(struct MacroDef { body, legacy });
439440

440441
#[derive(RustcEncodable, RustcDecodable)]
441442
pub struct FnData {

src/librustc_resolve/build_reduced_graph.rs

Lines changed: 43 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use {resolve_error, resolve_struct_error, ResolutionError};
2323

2424
use rustc::middle::cstore::LoadedMacro;
2525
use rustc::hir::def::*;
26-
use rustc::hir::def_id::{CrateNum, BUILTIN_MACROS_CRATE, CRATE_DEF_INDEX, DefId};
26+
use rustc::hir::def_id::{BUILTIN_MACROS_CRATE, CRATE_DEF_INDEX, LOCAL_CRATE, DefId};
2727
use rustc::ty;
2828

2929
use std::cell::Cell;
@@ -150,7 +150,7 @@ impl<'a> Resolver<'a> {
150150
view_path.span,
151151
ResolutionError::SelfImportsOnlyAllowedWithin);
152152
} else if source_name == "$crate" && full_path.segments.len() == 1 {
153-
let crate_root = self.resolve_crate_var(source.ctxt, item.span);
153+
let crate_root = self.resolve_crate_root(source.ctxt);
154154
let crate_name = match crate_root.kind {
155155
ModuleKind::Def(_, name) => name,
156156
ModuleKind::Block(..) => unreachable!(),
@@ -247,7 +247,8 @@ impl<'a> Resolver<'a> {
247247

248248
// n.b. we don't need to look at the path option here, because cstore already did
249249
let crate_id = self.session.cstore.extern_mod_stmt_cnum(item.id).unwrap();
250-
let module = self.get_extern_crate_root(crate_id, item.span);
250+
let module =
251+
self.get_module(DefId { krate: crate_id, index: CRATE_DEF_INDEX });
251252
self.populate_module_if_necessary(module);
252253
let used = self.process_legacy_macro_imports(item, module, expansion);
253254
let binding =
@@ -279,7 +280,7 @@ impl<'a> Resolver<'a> {
279280
no_implicit_prelude: parent.no_implicit_prelude || {
280281
attr::contains_name(&item.attrs, "no_implicit_prelude")
281282
},
282-
..ModuleData::new(Some(parent), module_kind, def_id, item.span)
283+
..ModuleData::new(Some(parent), module_kind, def_id, expansion, item.span)
283284
});
284285
self.define(parent, ident, TypeNS, (module, vis, sp, expansion));
285286
self.module_map.insert(def_id, module);
@@ -317,6 +318,7 @@ impl<'a> Resolver<'a> {
317318
let module = self.new_module(parent,
318319
module_kind,
319320
parent.normal_ancestor_id,
321+
expansion,
320322
item.span);
321323
self.define(parent, ident, TypeNS, (module, vis, sp, expansion));
322324

@@ -376,6 +378,7 @@ impl<'a> Resolver<'a> {
376378
let module = self.new_module(parent,
377379
module_kind,
378380
parent.normal_ancestor_id,
381+
expansion,
379382
item.span);
380383
self.define(parent, ident, TypeNS, (module, vis, sp, expansion));
381384
self.current_module = module;
@@ -421,12 +424,13 @@ impl<'a> Resolver<'a> {
421424
self.define(parent, item.ident, ValueNS, (def, vis, item.span, expansion));
422425
}
423426

424-
fn build_reduced_graph_for_block(&mut self, block: &Block) {
427+
fn build_reduced_graph_for_block(&mut self, block: &Block, expansion: Mark) {
425428
let parent = self.current_module;
426429
if self.block_needs_anonymous_module(block) {
427430
let module = self.new_module(parent,
428431
ModuleKind::Block(block.id),
429432
parent.normal_ancestor_id,
433+
expansion,
430434
block.span);
431435
self.block_map.insert(block.id, module);
432436
self.current_module = module; // Descend into the block.
@@ -440,23 +444,24 @@ impl<'a> Resolver<'a> {
440444
let def_id = def.def_id();
441445
let vis = self.session.cstore.visibility(def_id);
442446
let span = child.span;
443-
447+
let expansion = Mark::root(); // FIXME(jseyfried) intercrate hygiene
444448
match def {
445449
Def::Mod(..) | Def::Enum(..) => {
446450
let module = self.new_module(parent,
447451
ModuleKind::Def(def, ident.name),
448452
def_id,
453+
expansion,
449454
span);
450-
self.define(parent, ident, TypeNS, (module, vis, DUMMY_SP, Mark::root()));
455+
self.define(parent, ident, TypeNS, (module, vis, DUMMY_SP, expansion));
451456
}
452457
Def::Variant(..) | Def::TyAlias(..) => {
453-
self.define(parent, ident, TypeNS, (def, vis, DUMMY_SP, Mark::root()));
458+
self.define(parent, ident, TypeNS, (def, vis, DUMMY_SP, expansion));
454459
}
455460
Def::Fn(..) | Def::Static(..) | Def::Const(..) | Def::VariantCtor(..) => {
456-
self.define(parent, ident, ValueNS, (def, vis, DUMMY_SP, Mark::root()));
461+
self.define(parent, ident, ValueNS, (def, vis, DUMMY_SP, expansion));
457462
}
458463
Def::StructCtor(..) => {
459-
self.define(parent, ident, ValueNS, (def, vis, DUMMY_SP, Mark::root()));
464+
self.define(parent, ident, ValueNS, (def, vis, DUMMY_SP, expansion));
460465

461466
if let Some(struct_def_id) =
462467
self.session.cstore.def_key(def_id).parent
@@ -469,14 +474,15 @@ impl<'a> Resolver<'a> {
469474
let module = self.new_module(parent,
470475
module_kind,
471476
parent.normal_ancestor_id,
477+
expansion,
472478
span);
473-
self.define(parent, ident, TypeNS, (module, vis, DUMMY_SP, Mark::root()));
479+
self.define(parent, ident, TypeNS, (module, vis, DUMMY_SP, expansion));
474480

475481
for child in self.session.cstore.item_children(def_id) {
476482
let ns = if let Def::AssociatedTy(..) = child.def { TypeNS } else { ValueNS };
477483
let ident = Ident::with_empty_ctxt(child.name);
478484
self.define(module, ident, ns, (child.def, ty::Visibility::Public,
479-
DUMMY_SP, Mark::root()));
485+
DUMMY_SP, expansion));
480486

481487
if self.session.cstore.associated_item_cloned(child.def.def_id())
482488
.method_has_self_argument {
@@ -486,31 +492,42 @@ impl<'a> Resolver<'a> {
486492
module.populated.set(true);
487493
}
488494
Def::Struct(..) | Def::Union(..) => {
489-
self.define(parent, ident, TypeNS, (def, vis, DUMMY_SP, Mark::root()));
495+
self.define(parent, ident, TypeNS, (def, vis, DUMMY_SP, expansion));
490496

491497
// Record field names for error reporting.
492498
let field_names = self.session.cstore.struct_field_names(def_id);
493499
self.insert_field_names(def_id, field_names);
494500
}
495501
Def::Macro(..) => {
496-
self.define(parent, ident, MacroNS, (def, vis, DUMMY_SP, Mark::root()));
502+
self.define(parent, ident, MacroNS, (def, vis, DUMMY_SP, expansion));
497503
}
498504
_ => bug!("unexpected definition: {:?}", def)
499505
}
500506
}
501507

502-
fn get_extern_crate_root(&mut self, cnum: CrateNum, span: Span) -> Module<'a> {
503-
let def_id = DefId { krate: cnum, index: CRATE_DEF_INDEX };
504-
let name = self.session.cstore.crate_name(cnum);
505-
let macros_only = self.session.cstore.dep_kind(cnum).macros_only();
506-
let module_kind = ModuleKind::Def(Def::Mod(def_id), name);
507-
let arenas = self.arenas;
508-
*self.extern_crate_roots.entry((cnum, macros_only)).or_insert_with(|| {
509-
arenas.alloc_module(ModuleData::new(None, module_kind, def_id, span))
510-
})
508+
pub fn get_module(&mut self, def_id: DefId) -> Module<'a> {
509+
if def_id.krate == LOCAL_CRATE {
510+
return self.module_map[&def_id]
511+
}
512+
513+
let macros_only = self.session.cstore.dep_kind(def_id.krate).macros_only();
514+
if let Some(&module) = self.extern_module_map.get(&(def_id, macros_only)) {
515+
return module;
516+
}
517+
518+
let (name, parent) = if def_id.index == CRATE_DEF_INDEX {
519+
(self.session.cstore.crate_name(def_id.krate), None)
520+
} else {
521+
let def_key = self.session.cstore.def_key(def_id);
522+
(def_key.disambiguated_data.data.get_opt_name().unwrap(),
523+
Some(self.get_module(DefId { index: def_key.parent.unwrap(), ..def_id })))
524+
};
525+
526+
let kind = ModuleKind::Def(Def::Mod(def_id), name);
527+
self.arenas.alloc_module(ModuleData::new(parent, kind, def_id, Mark::root(), DUMMY_SP))
511528
}
512529

513-
pub fn macro_def_scope(&mut self, expansion: Mark, span: Span) -> Module<'a> {
530+
pub fn macro_def_scope(&mut self, expansion: Mark) -> Module<'a> {
514531
let def_id = self.macro_defs[&expansion];
515532
if let Some(id) = self.definitions.as_local_node_id(def_id) {
516533
self.local_macro_def_scopes[&id]
@@ -519,7 +536,7 @@ impl<'a> Resolver<'a> {
519536
self.graph_root
520537
} else {
521538
let module_def_id = ty::DefIdTree::parent(&*self, def_id).unwrap();
522-
self.get_extern_crate_root(module_def_id.krate, span)
539+
self.get_module(module_def_id)
523540
}
524541
}
525542

@@ -766,7 +783,7 @@ impl<'a, 'b> Visitor<'a> for BuildReducedGraphVisitor<'a, 'b> {
766783

767784
fn visit_block(&mut self, block: &'a Block) {
768785
let (parent, legacy_scope) = (self.resolver.current_module, self.legacy_scope);
769-
self.resolver.build_reduced_graph_for_block(block);
786+
self.resolver.build_reduced_graph_for_block(block, self.expansion);
770787
visit::walk_block(self, block);
771788
self.resolver.current_module = parent;
772789
self.legacy_scope = legacy_scope;

0 commit comments

Comments
 (0)