Skip to content

Commit a86806a

Browse files
committed
resolve: Move some code around
1 parent a164419 commit a86806a

File tree

4 files changed

+84
-88
lines changed

4 files changed

+84
-88
lines changed

src/librustc_resolve/build_reduced_graph.rs

+22-24
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,9 @@ impl<'a> Resolver<'a> {
653653
span);
654654
self.define(parent, ident, TypeNS, (module, vis, DUMMY_SP, expansion));
655655
}
656-
Res::Def(DefKind::Variant, _)
656+
Res::Def(DefKind::Struct, _)
657+
| Res::Def(DefKind::Union, _)
658+
| Res::Def(DefKind::Variant, _)
657659
| Res::Def(DefKind::TyAlias, _)
658660
| Res::Def(DefKind::ForeignTy, _)
659661
| Res::Def(DefKind::Existential, _)
@@ -663,37 +665,33 @@ impl<'a> Resolver<'a> {
663665
| Res::PrimTy(..)
664666
| Res::ToolMod => {
665667
self.define(parent, ident, TypeNS, (res, vis, DUMMY_SP, expansion));
668+
669+
if let Res::Def(DefKind::Struct, def_id) | Res::Def(DefKind::Union, def_id) = res {
670+
// Record field names for error reporting.
671+
let field_names = self.cstore.struct_field_names_untracked(def_id);
672+
self.insert_field_names(def_id, field_names);
673+
}
666674
}
667675
Res::Def(DefKind::Fn, _)
676+
| Res::Def(DefKind::Method, _)
668677
| Res::Def(DefKind::Static, _)
669678
| Res::Def(DefKind::Const, _)
670679
| Res::Def(DefKind::AssocConst, _)
671-
| Res::Def(DefKind::Ctor(CtorOf::Variant, ..), _) => {
672-
self.define(parent, ident, ValueNS, (res, vis, DUMMY_SP, expansion));
673-
}
674-
Res::Def(DefKind::Ctor(CtorOf::Struct, ..), def_id) => {
675-
self.define(parent, ident, ValueNS, (res, vis, DUMMY_SP, expansion));
676-
677-
if let Some(struct_def_id) =
678-
self.cstore.def_key(def_id).parent
679-
.map(|index| DefId { krate: def_id.krate, index: index }) {
680-
self.struct_constructors.insert(struct_def_id, (res, vis));
681-
}
682-
}
683-
Res::Def(DefKind::Method, def_id) => {
680+
| Res::Def(DefKind::Ctor(..), _) => {
684681
self.define(parent, ident, ValueNS, (res, vis, DUMMY_SP, expansion));
685682

686-
if self.cstore.associated_item_cloned_untracked(def_id).method_has_self_argument {
687-
self.has_self.insert(def_id);
683+
if let Res::Def(DefKind::Method, def_id) = res {
684+
let assoc_item = self.cstore.associated_item_cloned_untracked(def_id);
685+
if assoc_item.method_has_self_argument {
686+
self.has_self.insert(def_id);
687+
}
688+
} else if let Res::Def(DefKind::Ctor(CtorOf::Struct, ..), def_id) = res {
689+
let parent = self.cstore.def_key(def_id).parent;
690+
if let Some(struct_def_id) = parent.map(|index| DefId { index, ..def_id }) {
691+
self.struct_constructors.insert(struct_def_id, (res, vis));
692+
}
688693
}
689694
}
690-
Res::Def(DefKind::Struct, def_id) | Res::Def(DefKind::Union, def_id) => {
691-
self.define(parent, ident, TypeNS, (res, vis, DUMMY_SP, expansion));
692-
693-
// Record field names for error reporting.
694-
let field_names = self.cstore.struct_field_names_untracked(def_id);
695-
self.insert_field_names(def_id, field_names);
696-
}
697695
Res::Def(DefKind::Macro(..), _) | Res::NonMacroAttr(..) => {
698696
self.define(parent, ident, MacroNS, (res, vis, DUMMY_SP, expansion));
699697
}
@@ -837,7 +835,7 @@ impl<'a> Resolver<'a> {
837835
if let Some(span) = import_all {
838836
let directive = macro_use_directive(span);
839837
self.potentially_unused_imports.push(directive);
840-
module.for_each_child(self, |this, ident, ns, binding| if ns == MacroNS {
838+
self.for_each_child(module, |this, ident, ns, binding| if ns == MacroNS {
841839
let imported_binding = this.import(binding, directive);
842840
this.legacy_import_macro(ident.name, imported_binding, span, allow_shadowing);
843841
});

src/librustc_resolve/diagnostics.rs

+22-22
Original file line numberDiff line numberDiff line change
@@ -65,23 +65,23 @@ fn add_typo_suggestion(
6565
false
6666
}
6767

68-
fn add_module_candidates<'a>(
69-
resolver: &mut Resolver<'a>,
70-
module: Module<'a>,
71-
names: &mut Vec<TypoSuggestion>,
72-
filter_fn: &impl Fn(Res) -> bool,
73-
) {
74-
for (&(ident, _), resolution) in resolver.resolutions(module).borrow().iter() {
75-
if let Some(binding) = resolution.borrow().binding {
76-
let res = binding.res();
77-
if filter_fn(res) {
78-
names.push(TypoSuggestion::from_res(ident.name, res));
68+
impl<'a> Resolver<'a> {
69+
fn add_module_candidates(
70+
&mut self,
71+
module: Module<'a>,
72+
names: &mut Vec<TypoSuggestion>,
73+
filter_fn: &impl Fn(Res) -> bool,
74+
) {
75+
for (&(ident, _), resolution) in self.resolutions(module).borrow().iter() {
76+
if let Some(binding) = resolution.borrow().binding {
77+
let res = binding.res();
78+
if filter_fn(res) {
79+
names.push(TypoSuggestion::from_res(ident.name, res));
80+
}
7981
}
8082
}
8183
}
82-
}
8384

84-
impl<'a> Resolver<'a> {
8585
/// Handles error reporting for `smart_resolve_path_fragment` function.
8686
/// Creates base error and amends it with one short label and possibly some longer helps/notes.
8787
pub(crate) fn smart_resolve_report_errors(
@@ -596,10 +596,10 @@ impl<'a> Resolver<'a> {
596596
Scope::CrateRoot => {
597597
let root_ident = Ident::new(kw::PathRoot, ident.span);
598598
let root_module = this.resolve_crate_root(root_ident);
599-
add_module_candidates(this, root_module, &mut suggestions, filter_fn);
599+
this.add_module_candidates(root_module, &mut suggestions, filter_fn);
600600
}
601601
Scope::Module(module) => {
602-
add_module_candidates(this, module, &mut suggestions, filter_fn);
602+
this.add_module_candidates(module, &mut suggestions, filter_fn);
603603
}
604604
Scope::MacroUsePrelude => {
605605
suggestions.extend(this.macro_use_prelude.iter().filter_map(|(name, binding)| {
@@ -647,7 +647,7 @@ impl<'a> Resolver<'a> {
647647
Scope::StdLibPrelude => {
648648
if let Some(prelude) = this.prelude {
649649
let mut tmp_suggestions = Vec::new();
650-
add_module_candidates(this, prelude, &mut tmp_suggestions, filter_fn);
650+
this.add_module_candidates(prelude, &mut tmp_suggestions, filter_fn);
651651
suggestions.extend(tmp_suggestions.into_iter().filter(|s| {
652652
use_prelude || this.is_builtin_macro(s.res.opt_def_id())
653653
}));
@@ -709,7 +709,7 @@ impl<'a> Resolver<'a> {
709709
// Items in scope
710710
if let RibKind::ModuleRibKind(module) = rib.kind {
711711
// Items from this module
712-
add_module_candidates(self, module, &mut names, &filter_fn);
712+
self.add_module_candidates(module, &mut names, &filter_fn);
713713

714714
if let ModuleKind::Block(..) = module.kind {
715715
// We can see through blocks
@@ -737,7 +737,7 @@ impl<'a> Resolver<'a> {
737737
}));
738738

739739
if let Some(prelude) = self.prelude {
740-
add_module_candidates(self, prelude, &mut names, &filter_fn);
740+
self.add_module_candidates(prelude, &mut names, &filter_fn);
741741
}
742742
}
743743
break;
@@ -759,7 +759,7 @@ impl<'a> Resolver<'a> {
759759
mod_path, Some(TypeNS), false, span, CrateLint::No
760760
) {
761761
if let ModuleOrUniformRoot::Module(module) = module {
762-
add_module_candidates(self, module, &mut names, &filter_fn);
762+
self.add_module_candidates(module, &mut names, &filter_fn);
763763
}
764764
}
765765
}
@@ -799,7 +799,7 @@ impl<'a> Resolver<'a> {
799799
in_module_is_extern)) = worklist.pop() {
800800
// We have to visit module children in deterministic order to avoid
801801
// instabilities in reported imports (#43552).
802-
in_module.for_each_child_stable(self, |this, ident, ns, name_binding| {
802+
self.for_each_child_stable(in_module, |this, ident, ns, name_binding| {
803803
// avoid imports entirely
804804
if name_binding.is_import() && !name_binding.is_extern_crate() { return; }
805805
// avoid non-importable candidates as well
@@ -911,7 +911,7 @@ impl<'a> Resolver<'a> {
911911
// abort if the module is already found
912912
if result.is_some() { break; }
913913

914-
in_module.for_each_child_stable(self, |_, ident, _, name_binding| {
914+
self.for_each_child_stable(in_module, |_, ident, _, name_binding| {
915915
// abort if the module is already found or if name_binding is private external
916916
if result.is_some() || !name_binding.vis.is_visible_locally() {
917917
return
@@ -943,7 +943,7 @@ impl<'a> Resolver<'a> {
943943
fn collect_enum_variants(&mut self, def_id: DefId) -> Option<Vec<Path>> {
944944
self.find_module(def_id).map(|(enum_module, enum_import_suggestion)| {
945945
let mut variants = Vec::new();
946-
enum_module.for_each_child_stable(self, |_, ident, _, name_binding| {
946+
self.for_each_child_stable(enum_module, |_, ident, _, name_binding| {
947947
if let Res::Def(DefKind::Variant, _) = name_binding.res() {
948948
let mut segms = enum_import_suggestion.path.segments.clone();
949949
segms.push(ast::PathSegment::from_ident(ident));

src/librustc_resolve/lib.rs

+38-22
Original file line numberDiff line numberDiff line change
@@ -1222,25 +1222,6 @@ impl<'a> ModuleData<'a> {
12221222
}
12231223
}
12241224

1225-
fn for_each_child<F>(&'a self, resolver: &mut Resolver<'a>, mut f: F)
1226-
where F: FnMut(&mut Resolver<'a>, Ident, Namespace, &'a NameBinding<'a>)
1227-
{
1228-
for (&(ident, ns), name_resolution) in resolver.resolutions(self).borrow().iter() {
1229-
name_resolution.borrow().binding.map(|binding| f(resolver, ident, ns, binding));
1230-
}
1231-
}
1232-
1233-
fn for_each_child_stable<F>(&'a self, resolver: &mut Resolver<'a>, mut f: F)
1234-
where F: FnMut(&mut Resolver<'a>, Ident, Namespace, &'a NameBinding<'a>)
1235-
{
1236-
let resolutions = resolver.resolutions(self).borrow();
1237-
let mut resolutions = resolutions.iter().collect::<Vec<_>>();
1238-
resolutions.sort_by_cached_key(|&(&(ident, ns), _)| (ident.as_str(), ns));
1239-
for &(&(ident, ns), &resolution) in resolutions.iter() {
1240-
resolution.borrow().binding.map(|binding| f(resolver, ident, ns, binding));
1241-
}
1242-
}
1243-
12441225
fn res(&self) -> Option<Res> {
12451226
match self.kind {
12461227
ModuleKind::Def(kind, def_id, _) => Some(Res::Def(kind, def_id)),
@@ -1900,9 +1881,7 @@ impl<'a> Resolver<'a> {
19001881
seg.id = self.session.next_node_id();
19011882
seg
19021883
}
1903-
}
19041884

1905-
impl<'a> Resolver<'a> {
19061885
pub fn new(session: &'a Session,
19071886
cstore: &'a CStore,
19081887
krate: &Crate,
@@ -2107,6 +2086,43 @@ impl<'a> Resolver<'a> {
21072086
self.arenas.alloc_module(module)
21082087
}
21092088

2089+
fn resolutions(&mut self, module: Module<'a>) -> &'a Resolutions<'a> {
2090+
if module.populate_on_access.get() {
2091+
module.populate_on_access.set(false);
2092+
let def_id = module.def_id().expect("unpopulated module without a def-id");
2093+
for child in self.cstore.item_children_untracked(def_id, self.session) {
2094+
let child = child.map_id(|_| panic!("unexpected id"));
2095+
self.build_reduced_graph_for_external_crate_res(module, child);
2096+
}
2097+
}
2098+
&module.lazy_resolutions
2099+
}
2100+
2101+
fn resolution(&mut self, module: Module<'a>, ident: Ident, ns: Namespace)
2102+
-> &'a RefCell<NameResolution<'a>> {
2103+
*self.resolutions(module).borrow_mut().entry((ident.modern(), ns))
2104+
.or_insert_with(|| self.arenas.alloc_name_resolution())
2105+
}
2106+
2107+
fn for_each_child<F>(&mut self, module: Module<'a>, mut f: F)
2108+
where F: FnMut(&mut Resolver<'a>, Ident, Namespace, &'a NameBinding<'a>)
2109+
{
2110+
for (&(ident, ns), name_resolution) in self.resolutions(module).borrow().iter() {
2111+
name_resolution.borrow().binding.map(|binding| f(self, ident, ns, binding));
2112+
}
2113+
}
2114+
2115+
fn for_each_child_stable<F>(&mut self, module: Module<'a>, mut f: F)
2116+
where F: FnMut(&mut Resolver<'a>, Ident, Namespace, &'a NameBinding<'a>)
2117+
{
2118+
let resolutions = self.resolutions(module).borrow();
2119+
let mut resolutions = resolutions.iter().collect::<Vec<_>>();
2120+
resolutions.sort_by_cached_key(|&(&(ident, ns), _)| (ident.as_str(), ns));
2121+
for &(&(ident, ns), &resolution) in resolutions.iter() {
2122+
resolution.borrow().binding.map(|binding| f(self, ident, ns, binding));
2123+
}
2124+
}
2125+
21102126
fn record_use(&mut self, ident: Ident, ns: Namespace,
21112127
used_binding: &'a NameBinding<'a>, is_lexical_scope: bool) {
21122128
if let Some((b2, kind)) = used_binding.ambiguity {
@@ -4522,7 +4538,7 @@ impl<'a> Resolver<'a> {
45224538
let mut traits = module.traits.borrow_mut();
45234539
if traits.is_none() {
45244540
let mut collected_traits = Vec::new();
4525-
module.for_each_child(self, |_, name, ns, binding| {
4541+
self.for_each_child(module, |_, name, ns, binding| {
45264542
if ns != TypeNS { return }
45274543
match binding.res() {
45284544
Res::Def(DefKind::Trait, _) |

src/librustc_resolve/resolve_imports.rs

+2-20
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::{CrateLint, Module, ModuleOrUniformRoot, PerNS, ScopeSet, ParentScope
55
use crate::Determinacy::{self, *};
66
use crate::Namespace::{self, TypeNS, MacroNS};
77
use crate::{NameBinding, NameBindingKind, ToNameBinding, PathResult, PrivacyError};
8-
use crate::{Resolutions, Resolver, Segment};
8+
use crate::{Resolver, Segment};
99
use crate::{names_to_string, module_to_string};
1010
use crate::{resolve_error, ResolutionError};
1111
use crate::ModuleKind;
@@ -36,7 +36,7 @@ use syntax_pos::{MultiSpan, Span};
3636

3737
use log::*;
3838

39-
use std::cell::{Cell, RefCell};
39+
use std::cell::Cell;
4040
use std::{mem, ptr};
4141

4242
type Res = def::Res<NodeId>;
@@ -156,24 +156,6 @@ impl<'a> NameResolution<'a> {
156156
}
157157

158158
impl<'a> Resolver<'a> {
159-
crate fn resolutions(&mut self, module: Module<'a>) -> &'a Resolutions<'a> {
160-
if module.populate_on_access.get() {
161-
module.populate_on_access.set(false);
162-
let def_id = module.def_id().expect("unpopulated module without a def-id");
163-
for child in self.cstore.item_children_untracked(def_id, self.session) {
164-
let child = child.map_id(|_| panic!("unexpected id"));
165-
self.build_reduced_graph_for_external_crate_res(module, child);
166-
}
167-
}
168-
&module.lazy_resolutions
169-
}
170-
171-
fn resolution(&mut self, module: Module<'a>, ident: Ident, ns: Namespace)
172-
-> &'a RefCell<NameResolution<'a>> {
173-
*self.resolutions(module).borrow_mut().entry((ident.modern(), ns))
174-
.or_insert_with(|| self.arenas.alloc_name_resolution())
175-
}
176-
177159
crate fn resolve_ident_in_module_unadjusted(
178160
&mut self,
179161
module: ModuleOrUniformRoot<'a>,

0 commit comments

Comments
 (0)