Skip to content

Commit 6e9adcb

Browse files
committed
resolve: Cleanup module allocation
Construction of all modules is now centralized and performed by `fn new_module`.
1 parent fd58eea commit 6e9adcb

File tree

2 files changed

+73
-56
lines changed

2 files changed

+73
-56
lines changed

compiler/rustc_resolve/src/build_reduced_graph.rs

+37-26
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,9 @@ use crate::def_collector::collect_definitions;
99
use crate::imports::{Import, ImportKind};
1010
use crate::macros::{MacroRulesBinding, MacroRulesScope, MacroRulesScopeRef};
1111
use crate::Namespace::{self, MacroNS, TypeNS, ValueNS};
12-
use crate::{CrateLint, Determinacy, PathResult, ResolutionError, VisResolutionError};
13-
use crate::{
14-
ExternPreludeEntry, ModuleOrUniformRoot, ParentScope, PerNS, Resolver, ResolverArenas,
15-
};
16-
use crate::{Module, ModuleData, ModuleKind, NameBinding, NameBindingKind, Segment, ToNameBinding};
12+
use crate::{CrateLint, Determinacy, ExternPreludeEntry, Module, ModuleKind, ModuleOrUniformRoot};
13+
use crate::{NameBinding, NameBindingKind, ParentScope, PathResult, PerNS, ResolutionError};
14+
use crate::{Resolver, ResolverArenas, Segment, ToNameBinding, VisResolutionError};
1715

1816
use rustc_ast::visit::{self, AssocCtxt, Visitor};
1917
use rustc_ast::{self as ast, AssocItem, AssocItemKind, MetaItemKind, StmtKind};
@@ -142,13 +140,14 @@ impl<'a> Resolver<'a> {
142140
};
143141

144142
// Allocate and return a new module with the information we found
145-
let kind = ModuleKind::Def(DefKind::Mod, def_id, name);
146-
let module = self.arenas.alloc_module(ModuleData::new(
143+
let module = self.arenas.new_module(
147144
parent,
148-
kind,
145+
ModuleKind::Def(DefKind::Mod, def_id, name),
149146
self.cstore().module_expansion_untracked(def_id, &self.session),
150147
self.cstore().get_span_untracked(def_id, &self.session),
151-
));
148+
// FIXME: Account for `#[no_implicit_prelude]` attributes.
149+
parent.map_or(false, |module| module.no_implicit_prelude),
150+
);
152151
self.extern_module_map.insert(def_id, module);
153152
module
154153
}
@@ -767,13 +766,14 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
767766
}
768767

769768
ItemKind::Mod(..) => {
770-
let module_kind = ModuleKind::Def(DefKind::Mod, def_id, ident.name);
771-
let module = self.r.arenas.alloc_module(ModuleData {
772-
no_implicit_prelude: parent.no_implicit_prelude || {
773-
self.r.session.contains_name(&item.attrs, sym::no_implicit_prelude)
774-
},
775-
..ModuleData::new(Some(parent), module_kind, expansion.to_expn_id(), item.span)
776-
});
769+
let module = self.r.arenas.new_module(
770+
Some(parent),
771+
ModuleKind::Def(DefKind::Mod, def_id, ident.name),
772+
expansion.to_expn_id(),
773+
item.span,
774+
parent.no_implicit_prelude
775+
|| self.r.session.contains_name(&item.attrs, sym::no_implicit_prelude),
776+
);
777777
self.r.define(parent, ident, TypeNS, (module, vis, sp, expansion));
778778
self.r.module_map.insert(local_def_id, module);
779779

@@ -806,9 +806,13 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
806806
}
807807

808808
ItemKind::Enum(_, _) => {
809-
let module_kind = ModuleKind::Def(DefKind::Enum, def_id, ident.name);
810-
let module =
811-
self.r.new_module(parent, module_kind, expansion.to_expn_id(), item.span);
809+
let module = self.r.arenas.new_module(
810+
Some(parent),
811+
ModuleKind::Def(DefKind::Enum, def_id, ident.name),
812+
expansion.to_expn_id(),
813+
item.span,
814+
parent.no_implicit_prelude,
815+
);
812816
self.r.define(parent, ident, TypeNS, (module, vis, sp, expansion));
813817
self.parent_scope.module = module;
814818
}
@@ -876,9 +880,13 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
876880

877881
ItemKind::Trait(..) => {
878882
// Add all the items within to a new module.
879-
let module_kind = ModuleKind::Def(DefKind::Trait, def_id, ident.name);
880-
let module =
881-
self.r.new_module(parent, module_kind, expansion.to_expn_id(), item.span);
883+
let module = self.r.arenas.new_module(
884+
Some(parent),
885+
ModuleKind::Def(DefKind::Trait, def_id, ident.name),
886+
expansion.to_expn_id(),
887+
item.span,
888+
parent.no_implicit_prelude,
889+
);
882890
self.r.define(parent, ident, TypeNS, (module, vis, sp, expansion));
883891
self.parent_scope.module = module;
884892
}
@@ -915,11 +923,12 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
915923
let parent = self.parent_scope.module;
916924
let expansion = self.parent_scope.expansion;
917925
if self.block_needs_anonymous_module(block) {
918-
let module = self.r.new_module(
919-
parent,
926+
let module = self.r.arenas.new_module(
927+
Some(parent),
920928
ModuleKind::Block(block.id),
921929
expansion.to_expn_id(),
922930
block.span,
931+
parent.no_implicit_prelude,
923932
);
924933
self.r.block_map.insert(block.id, module);
925934
self.parent_scope.module = module; // Descend into the block.
@@ -935,11 +944,13 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
935944
// Record primary definitions.
936945
match res {
937946
Res::Def(kind @ (DefKind::Mod | DefKind::Enum | DefKind::Trait), def_id) => {
938-
let module = self.r.new_module(
939-
parent,
947+
let module = self.r.arenas.new_module(
948+
Some(parent),
940949
ModuleKind::Def(kind, def_id, ident.name),
941950
expansion.to_expn_id(),
942951
span,
952+
// FIXME: Account for `#[no_implicit_prelude]` attributes.
953+
parent.no_implicit_prelude,
943954
);
944955
self.r.define(parent, ident, TypeNS, (module, vis, span, expansion));
945956
}

compiler/rustc_resolve/src/lib.rs

+36-30
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ use rustc_expand::base::{DeriveResolutions, SyntaxExtension, SyntaxExtensionKind
4141
use rustc_hir::def::Namespace::*;
4242
use rustc_hir::def::{self, CtorOf, DefKind, NonMacroAttrKind, PartialRes};
4343
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefPathHash, LocalDefId};
44-
use rustc_hir::def_id::{CRATE_DEF_INDEX, LOCAL_CRATE};
44+
use rustc_hir::def_id::{CRATE_DEF_ID, CRATE_DEF_INDEX, LOCAL_CRATE};
4545
use rustc_hir::definitions::{DefKey, DefPathData, Definitions};
4646
use rustc_hir::TraitCandidate;
4747
use rustc_index::vec::IndexVec;
@@ -533,7 +533,13 @@ pub struct ModuleData<'a> {
533533
type Module<'a> = &'a ModuleData<'a>;
534534

535535
impl<'a> ModuleData<'a> {
536-
fn new(parent: Option<Module<'a>>, kind: ModuleKind, expansion: ExpnId, span: Span) -> Self {
536+
fn new(
537+
parent: Option<Module<'a>>,
538+
kind: ModuleKind,
539+
expansion: ExpnId,
540+
span: Span,
541+
no_implicit_prelude: bool,
542+
) -> Self {
537543
let is_foreign = match kind {
538544
ModuleKind::Def(_, def_id, _) => !def_id.is_local(),
539545
ModuleKind::Block(_) => false,
@@ -544,7 +550,7 @@ impl<'a> ModuleData<'a> {
544550
lazy_resolutions: Default::default(),
545551
populate_on_access: Cell::new(is_foreign),
546552
unexpanded_invocations: Default::default(),
547-
no_implicit_prelude: false,
553+
no_implicit_prelude,
548554
glob_importers: RefCell::new(Vec::new()),
549555
globs: RefCell::new(Vec::new()),
550556
traits: RefCell::new(None),
@@ -1055,8 +1061,16 @@ pub struct ResolverArenas<'a> {
10551061
}
10561062

10571063
impl<'a> ResolverArenas<'a> {
1058-
fn alloc_module(&'a self, module: ModuleData<'a>) -> Module<'a> {
1059-
let module = self.modules.alloc(module);
1064+
fn new_module(
1065+
&'a self,
1066+
parent: Option<Module<'a>>,
1067+
kind: ModuleKind,
1068+
expn_id: ExpnId,
1069+
span: Span,
1070+
no_implicit_prelude: bool,
1071+
) -> Module<'a> {
1072+
let module =
1073+
self.modules.alloc(ModuleData::new(parent, kind, expn_id, span, no_implicit_prelude));
10601074
if module.def_id().map_or(true, |def_id| def_id.is_local()) {
10611075
self.local_modules.borrow_mut().push(module);
10621076
}
@@ -1258,26 +1272,29 @@ impl<'a> Resolver<'a> {
12581272
metadata_loader: Box<MetadataLoaderDyn>,
12591273
arenas: &'a ResolverArenas<'a>,
12601274
) -> Resolver<'a> {
1261-
let root_local_def_id = LocalDefId { local_def_index: CRATE_DEF_INDEX };
1262-
let root_def_id = root_local_def_id.to_def_id();
1263-
let root_module_kind = ModuleKind::Def(DefKind::Mod, root_def_id, kw::Empty);
1264-
let graph_root = arenas.alloc_module(ModuleData {
1265-
no_implicit_prelude: session.contains_name(&krate.attrs, sym::no_implicit_prelude),
1266-
..ModuleData::new(None, root_module_kind, ExpnId::root(), krate.span)
1267-
});
1268-
let empty_module_kind = ModuleKind::Def(DefKind::Mod, root_def_id, kw::Empty);
1269-
let empty_module = arenas.alloc_module(ModuleData {
1270-
no_implicit_prelude: true,
1271-
..ModuleData::new(Some(graph_root), empty_module_kind, ExpnId::root(), DUMMY_SP)
1272-
});
1275+
let root_def_id = CRATE_DEF_ID.to_def_id();
1276+
let graph_root = arenas.new_module(
1277+
None,
1278+
ModuleKind::Def(DefKind::Mod, root_def_id, kw::Empty),
1279+
ExpnId::root(),
1280+
krate.span,
1281+
session.contains_name(&krate.attrs, sym::no_implicit_prelude),
1282+
);
1283+
let empty_module = arenas.new_module(
1284+
None,
1285+
ModuleKind::Def(DefKind::Mod, root_def_id, kw::Empty),
1286+
ExpnId::root(),
1287+
DUMMY_SP,
1288+
true,
1289+
);
12731290
let mut module_map = FxHashMap::default();
1274-
module_map.insert(root_local_def_id, graph_root);
1291+
module_map.insert(CRATE_DEF_ID, graph_root);
12751292

12761293
let definitions = Definitions::new(session.local_stable_crate_id(), krate.span);
12771294
let root = definitions.get_root_def();
12781295

12791296
let mut visibilities = FxHashMap::default();
1280-
visibilities.insert(root_local_def_id, ty::Visibility::Public);
1297+
visibilities.insert(CRATE_DEF_ID, ty::Visibility::Public);
12811298

12821299
let mut def_id_to_node_id = IndexVec::default();
12831300
assert_eq!(def_id_to_node_id.push(CRATE_NODE_ID), root);
@@ -1629,17 +1646,6 @@ impl<'a> Resolver<'a> {
16291646
import_ids
16301647
}
16311648

1632-
fn new_module(
1633-
&self,
1634-
parent: Module<'a>,
1635-
kind: ModuleKind,
1636-
expn_id: ExpnId,
1637-
span: Span,
1638-
) -> Module<'a> {
1639-
let module = ModuleData::new(Some(parent), kind, expn_id, span);
1640-
self.arenas.alloc_module(module)
1641-
}
1642-
16431649
fn new_key(&mut self, ident: Ident, ns: Namespace) -> BindingKey {
16441650
let ident = ident.normalize_to_macros_2_0();
16451651
let disambiguator = if ident.name == kw::Underscore {

0 commit comments

Comments
 (0)