]> git.proxmox.com Git - rustc.git/blame - compiler/rustc_resolve/src/build_reduced_graph.rs
New upstream version 1.55.0+dfsg1
[rustc.git] / compiler / rustc_resolve / src / build_reduced_graph.rs
CommitLineData
e1599b0c
XL
1//! After we obtain a fresh AST fragment from a macro, code in this module helps to integrate
2//! that fragment into the module structures that are already partially built.
1a4d82fc 3//!
e1599b0c
XL
4//! Items from the fragment are placed into modules,
5//! unexpanded macros in the fragment are visited and registered.
6//! Imports are also considered items and placed into modules here, but not resolved yet.
1a4d82fc 7
60c5eb7d 8use crate::def_collector::collect_definitions;
74b04a01 9use crate::imports::{Import, ImportKind};
29967ef6 10use crate::macros::{MacroRulesBinding, MacroRulesScope, MacroRulesScopeRef};
dfeec247
XL
11use crate::Namespace::{self, MacroNS, TypeNS, ValueNS};
12use crate::{CrateLint, Determinacy, PathResult, ResolutionError, VisResolutionError};
13use crate::{
14 ExternPreludeEntry, ModuleOrUniformRoot, ParentScope, PerNS, Resolver, ResolverArenas,
15};
9fa01778 16use crate::{Module, ModuleData, ModuleKind, NameBinding, NameBindingKind, Segment, ToNameBinding};
1a4d82fc 17
74b04a01 18use rustc_ast::visit::{self, AssocCtxt, Visitor};
5869c6ff
XL
19use rustc_ast::{self as ast, AssocItem, AssocItemKind, MetaItemKind, StmtKind};
20use rustc_ast::{Block, FnKind, ForeignItem, ForeignItemKind, ImplKind, Item, ItemKind, NodeId};
f035d41b 21use rustc_ast_lowering::ResolverAstLowering;
74b04a01 22use rustc_attr as attr;
0531ce1d 23use rustc_data_structures::sync::Lrc;
dfeec247
XL
24use rustc_errors::{struct_span_err, Applicability};
25use rustc_expand::base::SyntaxExtension;
26use rustc_expand::expand::AstFragment;
27use rustc_hir::def::{self, *};
f9f354fc 28use rustc_hir::def_id::{DefId, LocalDefId, CRATE_DEF_INDEX};
dfeec247 29use rustc_metadata::creader::LoadedMacro;
ba9703b0
XL
30use rustc_middle::bug;
31use rustc_middle::hir::exports::Export;
32use rustc_middle::middle::cstore::CrateStore;
33use rustc_middle::ty;
136023e0 34use rustc_span::hygiene::{ExpnId, LocalExpnId, MacroKind};
dfeec247 35use rustc_span::source_map::{respan, Spanned};
f9f354fc 36use rustc_span::symbol::{kw, sym, Ident, Symbol};
3dfed10e 37use rustc_span::Span;
3157f602 38
dfeec247
XL
39use std::cell::Cell;
40use std::ptr;
3dfed10e 41use tracing::debug;
60c5eb7d 42
48663c56
XL
43type Res = def::Res<NodeId>;
44
136023e0 45impl<'a> ToNameBinding<'a> for (Module<'a>, ty::Visibility, Span, LocalExpnId) {
32a655c1
SL
46 fn to_name_binding(self, arenas: &'a ResolverArenas<'a>) -> &'a NameBinding<'a> {
47 arenas.alloc_name_binding(NameBinding {
476ff2be 48 kind: NameBindingKind::Module(self.0),
0731742a 49 ambiguity: None,
476ff2be
SL
50 vis: self.1,
51 span: self.2,
52 expansion: self.3,
32a655c1 53 })
7453a54e
SL
54 }
55}
56
136023e0 57impl<'a> ToNameBinding<'a> for (Res, ty::Visibility, Span, LocalExpnId) {
32a655c1
SL
58 fn to_name_binding(self, arenas: &'a ResolverArenas<'a>) -> &'a NameBinding<'a> {
59 arenas.alloc_name_binding(NameBinding {
48663c56 60 kind: NameBindingKind::Res(self.0, false),
0731742a 61 ambiguity: None,
b7449926
XL
62 vis: self.1,
63 span: self.2,
64 expansion: self.3,
65 })
66 }
67}
68
e1599b0c 69struct IsMacroExport;
b7449926 70
136023e0 71impl<'a> ToNameBinding<'a> for (Res, ty::Visibility, Span, LocalExpnId, IsMacroExport) {
b7449926
XL
72 fn to_name_binding(self, arenas: &'a ResolverArenas<'a>) -> &'a NameBinding<'a> {
73 arenas.alloc_name_binding(NameBinding {
48663c56 74 kind: NameBindingKind::Res(self.0, true),
0731742a 75 ambiguity: None,
476ff2be
SL
76 vis: self.1,
77 span: self.2,
78 expansion: self.3,
32a655c1 79 })
7453a54e
SL
80 }
81}
82
0731742a 83impl<'a> Resolver<'a> {
7453a54e
SL
84 /// Defines `name` in namespace `ns` of module `parent` to be `def` if it is not yet defined;
85 /// otherwise, reports an error.
e1599b0c 86 crate fn define<T>(&mut self, parent: Module<'a>, ident: Ident, ns: Namespace, def: T)
dfeec247
XL
87 where
88 T: ToNameBinding<'a>,
5bcae85e 89 {
32a655c1 90 let binding = def.to_name_binding(self.arenas);
e74abb32
XL
91 let key = self.new_key(ident, ns);
92 if let Err(old_binding) = self.try_define(parent, key, binding) {
32a655c1 93 self.report_conflict(parent, ident, ns, old_binding, &binding);
1a4d82fc
JJ
94 }
95 }
96
29967ef6
XL
97 /// Walks up the tree of definitions starting at `def_id`,
98 /// stopping at the first `DefKind::Mod` encountered
5869c6ff 99 fn nearest_parent_mod(&mut self, def_id: DefId) -> Module<'a> {
29967ef6
XL
100 let def_key = self.cstore().def_key(def_id);
101
102 let mut parent_id = DefId {
103 krate: def_id.krate,
104 index: def_key.parent.expect("failed to get parent for module"),
105 };
106 // The immediate parent may not be a module
107 // (e.g. `const _: () = { #[path = "foo.rs"] mod foo; };`)
108 // Walk up the tree until we hit a module or the crate root.
109 while parent_id.index != CRATE_DEF_INDEX
110 && self.cstore().def_kind(parent_id) != DefKind::Mod
111 {
112 let parent_def_key = self.cstore().def_key(parent_id);
113 parent_id.index = parent_def_key.parent.expect("failed to get parent for module");
114 }
115 self.get_module(parent_id)
116 }
117
5869c6ff 118 pub fn get_module(&mut self, def_id: DefId) -> Module<'a> {
f035d41b 119 // If this is a local module, it will be in `module_map`, no need to recalculate it.
ba9703b0 120 if let Some(def_id) = def_id.as_local() {
dfeec247 121 return self.module_map[&def_id];
416331ca
XL
122 }
123
f035d41b 124 // Cache module resolution
e74abb32 125 if let Some(&module) = self.extern_module_map.get(&def_id) {
416331ca
XL
126 return module;
127 }
128
129 let (name, parent) = if def_id.index == CRATE_DEF_INDEX {
f035d41b 130 // This is the crate root
136023e0 131 (self.cstore().crate_name(def_id.krate), None)
416331ca 132 } else {
e74abb32 133 let def_key = self.cstore().def_key(def_id);
3dfed10e
XL
134 let name = def_key
135 .disambiguated_data
136 .data
137 .get_opt_name()
138 .expect("given a DefId that wasn't a module");
29967ef6 139
5869c6ff 140 let parent = Some(self.nearest_parent_mod(def_id));
3dfed10e 141 (name, parent)
416331ca
XL
142 };
143
f035d41b 144 // Allocate and return a new module with the information we found
e74abb32 145 let kind = ModuleKind::Def(DefKind::Mod, def_id, name);
416331ca 146 let module = self.arenas.alloc_module(ModuleData::new(
dfeec247
XL
147 parent,
148 kind,
149 def_id,
3dfed10e
XL
150 self.cstore().module_expansion_untracked(def_id, &self.session),
151 self.cstore().get_span_untracked(def_id, &self.session),
416331ca 152 ));
e74abb32 153 self.extern_module_map.insert(def_id, module);
416331ca
XL
154 module
155 }
156
e1599b0c 157 crate fn macro_def_scope(&mut self, expn_id: ExpnId) -> Module<'a> {
f9f354fc
XL
158 let def_id = match expn_id.expn_data().macro_def_id {
159 Some(def_id) => def_id,
136023e0
XL
160 None => {
161 return expn_id
162 .as_local()
163 .and_then(|expn_id| self.ast_transform_scopes.get(&expn_id))
164 .unwrap_or(&self.graph_root);
165 }
416331ca 166 };
136023e0
XL
167 self.macro_def_scope_from_def_id(def_id)
168 }
169
170 crate fn macro_def_scope_from_def_id(&mut self, def_id: DefId) -> Module<'a> {
f9f354fc 171 if let Some(id) = def_id.as_local() {
416331ca
XL
172 self.local_macro_def_scopes[&id]
173 } else {
29967ef6
XL
174 // This is not entirely correct - a `macro_rules!` macro may occur
175 // inside a 'block' module:
176 //
177 // ```rust
178 // const _: () = {
179 // #[macro_export]
180 // macro_rules! my_macro {
181 // () => {};
182 // }
183 // `
184 // We don't record this information for external crates, so
185 // the module we compute here will be the closest 'mod' item
186 // (not necesssarily the actual parent of the `macro_rules!`
187 // macro). `macro_rules!` macros can't use def-site hygiene,
188 // so this hopefully won't be a problem.
189 //
190 // See https://github.com/rust-lang/rust/pull/77984#issuecomment-712445508
5869c6ff 191 self.nearest_parent_mod(def_id)
416331ca
XL
192 }
193 }
194
195 crate fn get_macro(&mut self, res: Res) -> Option<Lrc<SyntaxExtension>> {
196 match res {
5869c6ff 197 Res::Def(DefKind::Macro(..), def_id) => Some(self.get_macro_by_def_id(def_id)),
60c5eb7d 198 Res::NonMacroAttr(attr_kind) => Some(self.non_macro_attr(attr_kind.is_used())),
416331ca
XL
199 _ => None,
200 }
201 }
202
5869c6ff 203 crate fn get_macro_by_def_id(&mut self, def_id: DefId) -> Lrc<SyntaxExtension> {
416331ca 204 if let Some(ext) = self.macro_map.get(&def_id) {
5869c6ff 205 return ext.clone();
416331ca
XL
206 }
207
e74abb32
XL
208 let ext = Lrc::new(match self.cstore().load_macro_untracked(def_id, &self.session) {
209 LoadedMacro::MacroDef(item, edition) => self.compile_macro(&item, edition),
e1599b0c
XL
210 LoadedMacro::ProcMacro(ext) => ext,
211 });
416331ca 212
416331ca 213 self.macro_map.insert(def_id, ext.clone());
5869c6ff 214 ext
416331ca
XL
215 }
216
e1599b0c
XL
217 crate fn build_reduced_graph(
218 &mut self,
219 fragment: &AstFragment,
e1599b0c 220 parent_scope: ParentScope<'a>,
29967ef6 221 ) -> MacroRulesScopeRef<'a> {
f035d41b 222 collect_definitions(self, fragment, parent_scope.expansion);
e1599b0c
XL
223 let mut visitor = BuildReducedGraphVisitor { r: self, parent_scope };
224 fragment.visit_with(&mut visitor);
ba9703b0 225 visitor.parent_scope.macro_rules
e1599b0c
XL
226 }
227
228 crate fn build_reduced_graph_external(&mut self, module: Module<'a>) {
229 let def_id = module.def_id().expect("unpopulated module without a def-id");
e74abb32 230 for child in self.cstore().item_children_untracked(def_id, self.session) {
416331ca 231 let child = child.map_id(|_| panic!("unexpected id"));
29967ef6
XL
232 let parent_scope = ParentScope::module(module, self);
233 BuildReducedGraphVisitor { r: self, parent_scope }
e1599b0c 234 .build_reduced_graph_for_external_crate_res(child);
416331ca 235 }
416331ca
XL
236 }
237}
238
e1599b0c
XL
239struct BuildReducedGraphVisitor<'a, 'b> {
240 r: &'b mut Resolver<'a>,
241 parent_scope: ParentScope<'a>,
242}
243
244impl<'a> AsMut<Resolver<'a>> for BuildReducedGraphVisitor<'a, '_> {
dfeec247
XL
245 fn as_mut(&mut self) -> &mut Resolver<'a> {
246 self.r
247 }
416331ca
XL
248}
249
250impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
251 fn resolve_visibility(&mut self, vis: &ast::Visibility) -> ty::Visibility {
e74abb32
XL
252 self.resolve_visibility_speculative(vis, false).unwrap_or_else(|err| {
253 self.r.report_vis_error(err);
254 ty::Visibility::Public
255 })
256 }
257
258 fn resolve_visibility_speculative<'ast>(
259 &mut self,
260 vis: &'ast ast::Visibility,
261 speculative: bool,
262 ) -> Result<ty::Visibility, VisResolutionError<'ast>> {
416331ca 263 let parent_scope = &self.parent_scope;
1b1a35ee 264 match vis.kind {
e74abb32 265 ast::VisibilityKind::Public => Ok(ty::Visibility::Public),
416331ca 266 ast::VisibilityKind::Crate(..) => {
e74abb32 267 Ok(ty::Visibility::Restricted(DefId::local(CRATE_DEF_INDEX)))
416331ca
XL
268 }
269 ast::VisibilityKind::Inherited => {
6a06907d
XL
270 Ok(match self.parent_scope.module.kind {
271 // Any inherited visibility resolved directly inside an enum or trait
272 // (i.e. variants, fields, and trait items) inherits from the visibility
273 // of the enum or trait.
274 ModuleKind::Def(DefKind::Enum | DefKind::Trait, def_id, _) => {
275 self.r.visibilities[&def_id.expect_local()]
276 }
277 // Otherwise, the visibility is restricted to the nearest parent `mod` item.
278 _ => ty::Visibility::Restricted(self.parent_scope.module.nearest_parent_mod),
279 })
416331ca
XL
280 }
281 ast::VisibilityKind::Restricted { ref path, id, .. } => {
282 // For visibilities we are not ready to provide correct implementation of "uniform
283 // paths" right now, so on 2018 edition we only allow module-relative paths for now.
284 // On 2015 edition visibilities are resolved as crate-relative by default,
285 // so we are prepending a root segment if necessary.
286 let ident = path.segments.get(0).expect("empty path in visibility").ident;
287 let crate_root = if ident.is_path_segment_keyword() {
288 None
e74abb32 289 } else if ident.span.rust_2015() {
416331ca 290 Some(Segment::from_ident(Ident::new(
dfeec247
XL
291 kw::PathRoot,
292 path.span.shrink_to_lo().with_ctxt(ident.span.ctxt()),
416331ca 293 )))
e74abb32
XL
294 } else {
295 return Err(VisResolutionError::Relative2018(ident.span, path));
416331ca
XL
296 };
297
dfeec247
XL
298 let segments = crate_root
299 .into_iter()
300 .chain(path.segments.iter().map(|seg| seg.into()))
301 .collect::<Vec<_>>();
302 let expected_found_error = |res| {
303 Err(VisResolutionError::ExpectedFound(
304 path.span,
305 Segment::names_to_string(&segments),
306 res,
307 ))
308 };
416331ca
XL
309 match self.r.resolve_path(
310 &segments,
311 Some(TypeNS),
312 parent_scope,
e74abb32 313 !speculative,
416331ca
XL
314 path.span,
315 CrateLint::SimplePath(id),
316 ) {
317 PathResult::Module(ModuleOrUniformRoot::Module(module)) => {
318 let res = module.res().expect("visibility resolved to unnamed block");
e74abb32
XL
319 if !speculative {
320 self.r.record_partial_res(id, PartialRes::new(res));
321 }
416331ca
XL
322 if module.is_normal() {
323 if res == Res::Err {
e74abb32 324 Ok(ty::Visibility::Public)
416331ca
XL
325 } else {
326 let vis = ty::Visibility::Restricted(res.def_id());
327 if self.r.is_accessible_from(vis, parent_scope.module) {
e74abb32 328 Ok(vis)
416331ca 329 } else {
e74abb32 330 Err(VisResolutionError::AncestorOnly(path.span))
416331ca
XL
331 }
332 }
333 } else {
e74abb32 334 expected_found_error(res)
416331ca
XL
335 }
336 }
dfeec247
XL
337 PathResult::Module(..) => Err(VisResolutionError::ModuleOnly(path.span)),
338 PathResult::NonModule(partial_res) => {
339 expected_found_error(partial_res.base_res())
340 }
341 PathResult::Failed { span, label, suggestion, .. } => {
342 Err(VisResolutionError::FailedToResolve(span, label, suggestion))
343 }
344 PathResult::Indeterminate => Err(VisResolutionError::Indeterminate(path.span)),
416331ca
XL
345 }
346 }
347 }
348 }
349
e74abb32 350 fn insert_field_names_local(&mut self, def_id: DefId, vdata: &ast::VariantData) {
dfeec247
XL
351 let field_names = vdata
352 .fields()
353 .iter()
5869c6ff 354 .map(|field| respan(field.span, field.ident.map_or(kw::Empty, |ident| ident.name)))
dfeec247 355 .collect();
e74abb32
XL
356 self.insert_field_names(def_id, field_names);
357 }
358
f9f354fc 359 fn insert_field_names(&mut self, def_id: DefId, field_names: Vec<Spanned<Symbol>>) {
3dfed10e 360 self.r.field_names.insert(def_id, field_names);
416331ca
XL
361 }
362
1a4d82fc 363 fn block_needs_anonymous_module(&mut self, block: &Block) -> bool {
7453a54e 364 // If any statements are items, we need to create an anonymous module
29967ef6
XL
365 block
366 .stmts
367 .iter()
368 .any(|statement| matches!(statement.kind, StmtKind::Item(_) | StmtKind::MacCall(_)))
a7813a04
XL
369 }
370
74b04a01
XL
371 // Add an import to the current module.
372 fn add_import(
416331ca
XL
373 &mut self,
374 module_path: Vec<Segment>,
74b04a01 375 kind: ImportKind<'a>,
416331ca
XL
376 span: Span,
377 id: NodeId,
378 item: &ast::Item,
379 root_span: Span,
380 root_id: NodeId,
381 vis: ty::Visibility,
382 ) {
e1599b0c 383 let current_module = self.parent_scope.module;
74b04a01
XL
384 let import = self.r.arenas.alloc_import(Import {
385 kind,
e1599b0c 386 parent_scope: self.parent_scope,
416331ca
XL
387 module_path,
388 imported_module: Cell::new(None),
416331ca
XL
389 span,
390 id,
391 use_span: item.span,
392 use_span_with_attributes: item.span_with_attributes(),
393 has_attributes: !item.attrs.is_empty(),
394 root_span,
395 root_id,
396 vis: Cell::new(vis),
397 used: Cell::new(false),
398 });
399
74b04a01 400 debug!("add_import({:?})", import);
416331ca 401
74b04a01
XL
402 self.r.indeterminate_imports.push(import);
403 match import.kind {
e74abb32 404 // Don't add unresolved underscore imports to modules
74b04a01
XL
405 ImportKind::Single { target: Ident { name: kw::Underscore, .. }, .. } => {}
406 ImportKind::Single { target, type_ns_only, .. } => {
dfeec247
XL
407 self.r.per_ns(|this, ns| {
408 if !type_ns_only || ns == TypeNS {
409 let key = this.new_key(target, ns);
410 let mut resolution = this.resolution(current_module, key).borrow_mut();
74b04a01 411 resolution.add_single_import(import);
dfeec247 412 }
416331ca
XL
413 });
414 }
415 // We don't add prelude imports to the globs since they only affect lexical scopes,
416 // which are not relevant to import resolution.
74b04a01
XL
417 ImportKind::Glob { is_prelude: true, .. } => {}
418 ImportKind::Glob { .. } => current_module.globs.borrow_mut().push(import),
416331ca 419 _ => unreachable!(),
c30ab7b3
SL
420 }
421 }
9e0c209e 422
b7449926
XL
423 fn build_reduced_graph_for_use_tree(
424 &mut self,
0bf4aa26 425 // This particular use tree
b7449926
XL
426 use_tree: &ast::UseTree,
427 id: NodeId,
13cf67c4 428 parent_prefix: &[Segment],
b7449926 429 nested: bool,
0bf4aa26 430 // The whole `use` item
b7449926 431 item: &Item,
0bf4aa26
XL
432 vis: ty::Visibility,
433 root_span: Span,
b7449926 434 ) {
dfeec247
XL
435 debug!(
436 "build_reduced_graph_for_use_tree(parent_prefix={:?}, use_tree={:?}, nested={})",
437 parent_prefix, use_tree, nested
438 );
13cf67c4 439
dfeec247
XL
440 let mut prefix_iter = parent_prefix
441 .iter()
442 .cloned()
443 .chain(use_tree.prefix.segments.iter().map(|seg| seg.into()))
444 .peekable();
13cf67c4
XL
445
446 // On 2015 edition imports are resolved as crate-relative by default,
447 // so prefixes are prepended with crate root segment if necessary.
448 // The root is prepended lazily, when the first non-empty prefix or terminating glob
449 // appears, so imports in braced groups can have roots prepended independently.
1b1a35ee 450 let is_glob = matches!(use_tree.kind, ast::UseTreeKind::Glob);
13cf67c4 451 let crate_root = match prefix_iter.peek() {
532ac7d7 452 Some(seg) if !seg.ident.is_path_segment_keyword() && seg.ident.span.rust_2015() => {
13cf67c4 453 Some(seg.ident.span.ctxt())
b7449926 454 }
dfeec247 455 None if is_glob && use_tree.span.rust_2015() => Some(use_tree.span.ctxt()),
13cf67c4 456 _ => None,
dfeec247
XL
457 }
458 .map(|ctxt| {
459 Segment::from_ident(Ident::new(
460 kw::PathRoot,
461 use_tree.prefix.span.shrink_to_lo().with_ctxt(ctxt),
462 ))
463 });
b7449926 464
13cf67c4
XL
465 let prefix = crate_root.into_iter().chain(prefix_iter).collect::<Vec<_>>();
466 debug!("build_reduced_graph_for_use_tree: prefix={:?}", prefix);
ff7c6d11 467
13cf67c4 468 let empty_for_self = |prefix: &[Segment]| {
dfeec247 469 prefix.is_empty() || prefix.len() == 1 && prefix[0].ident.name == kw::PathRoot
0bf4aa26 470 };
ff7c6d11 471 match use_tree.kind {
94b46f34 472 ast::UseTreeKind::Simple(rename, ..) => {
e74abb32 473 let mut ident = use_tree.ident();
b7449926 474 let mut module_path = prefix;
83c7162d 475 let mut source = module_path.pop().unwrap();
ff7c6d11
XL
476 let mut type_ns_only = false;
477
478 if nested {
479 // Correctly handle `self`
dc9dc135 480 if source.ident.name == kw::SelfLower {
ff7c6d11
XL
481 type_ns_only = true;
482
0bf4aa26 483 if empty_for_self(&module_path) {
416331ca 484 self.r.report_error(
ff7c6d11 485 use_tree.span,
dfeec247 486 ResolutionError::SelfImportOnlyInImportListWithNonEmptyPrefix,
ff7c6d11
XL
487 );
488 return;
489 }
1a4d82fc 490
f9f354fc 491 // Replace `use foo::{ self };` with `use foo;`
b7449926 492 source = module_path.pop().unwrap();
0531ce1d 493 if rename.is_none() {
13cf67c4 494 ident = source.ident;
ff7c6d11 495 }
85aaf69f 496 }
ff7c6d11
XL
497 } else {
498 // Disallow `self`
dc9dc135 499 if source.ident.name == kw::SelfLower {
f9f354fc
XL
500 let parent = module_path.last();
501
502 let span = match parent {
503 // only `::self` from `use foo::self as bar`
504 Some(seg) => seg.ident.span.shrink_to_hi().to(source.ident.span),
505 None => source.ident.span,
506 };
507 let span_with_rename = match rename {
508 // only `self as bar` from `use foo::self as bar`
509 Some(rename) => source.ident.span.to(rename.span),
510 None => source.ident.span,
511 };
416331ca 512 self.r.report_error(
f9f354fc
XL
513 span,
514 ResolutionError::SelfImportsOnlyAllowedWithin {
515 root: parent.is_none(),
516 span_with_rename,
517 },
416331ca 518 );
f9f354fc
XL
519
520 // Error recovery: replace `use foo::self;` with `use foo;`
521 if let Some(parent) = module_path.pop() {
522 source = parent;
523 if rename.is_none() {
524 ident = source.ident;
525 }
526 }
85aaf69f 527 }
85aaf69f 528
ff7c6d11 529 // Disallow `use $crate;`
dc9dc135 530 if source.ident.name == kw::DollarCrate && module_path.is_empty() {
416331ca 531 let crate_root = self.r.resolve_crate_root(source.ident);
ff7c6d11 532 let crate_name = match crate_root.kind {
48663c56 533 ModuleKind::Def(.., name) => name,
ff7c6d11
XL
534 ModuleKind::Block(..) => unreachable!(),
535 };
b7449926 536 // HACK(eddyb) unclear how good this is, but keeping `$crate`
5869c6ff 537 // in `source` breaks `src/test/ui/imports/import-crate-var.rs`,
b7449926 538 // while the current crate doesn't have a valid `crate_name`.
5869c6ff 539 if crate_name != kw::Empty {
b7449926 540 // `crate_name` should not be interpreted as relative.
13cf67c4 541 module_path.push(Segment {
dfeec247 542 ident: Ident { name: kw::PathRoot, span: source.ident.span },
60c5eb7d 543 id: Some(self.r.next_node_id()),
f035d41b 544 has_generic_args: false,
b7449926 545 });
13cf67c4 546 source.ident.name = crate_name;
b7449926 547 }
0531ce1d 548 if rename.is_none() {
ff7c6d11 549 ident.name = crate_name;
85aaf69f
SL
550 }
551
dfeec247
XL
552 self.r
553 .session
554 .struct_span_err(item.span, "`$crate` may not be imported")
ff7c6d11 555 .emit();
85aaf69f 556 }
ff7c6d11 557 }
85aaf69f 558
dc9dc135 559 if ident.name == kw::Crate {
dfeec247
XL
560 self.r.session.span_err(
561 ident.span,
b7449926 562 "crate root imports need to be explicitly named: \
dfeec247
XL
563 `use crate as name;`",
564 );
b7449926
XL
565 }
566
74b04a01 567 let kind = ImportKind::Single {
13cf67c4 568 source: source.ident,
69743fb6
XL
569 target: ident,
570 source_bindings: PerNS {
416331ca
XL
571 type_ns: Cell::new(Err(Determinacy::Undetermined)),
572 value_ns: Cell::new(Err(Determinacy::Undetermined)),
573 macro_ns: Cell::new(Err(Determinacy::Undetermined)),
83c7162d 574 },
69743fb6
XL
575 target_bindings: PerNS {
576 type_ns: Cell::new(None),
577 value_ns: Cell::new(None),
578 macro_ns: Cell::new(None),
579 },
ff7c6d11 580 type_ns_only,
9fa01778 581 nested,
ff7c6d11 582 };
74b04a01 583 self.add_import(
94b46f34 584 module_path,
74b04a01 585 kind,
94b46f34
XL
586 use_tree.span,
587 id,
9fa01778 588 item,
0bf4aa26
XL
589 root_span,
590 item.id,
94b46f34 591 vis,
ff7c6d11
XL
592 );
593 }
594 ast::UseTreeKind::Glob => {
74b04a01 595 let kind = ImportKind::Glob {
3dfed10e 596 is_prelude: self.r.session.contains_name(&item.attrs, sym::prelude_import),
ff7c6d11
XL
597 max_vis: Cell::new(ty::Visibility::Invisible),
598 };
74b04a01 599 self.add_import(prefix, kind, use_tree.span, id, item, root_span, item.id, vis);
ff7c6d11
XL
600 }
601 ast::UseTreeKind::Nested(ref items) => {
ff7c6d11 602 // Ensure there is at most one `self` in the list
dfeec247
XL
603 let self_spans = items
604 .iter()
605 .filter_map(|&(ref use_tree, _)| {
606 if let ast::UseTreeKind::Simple(..) = use_tree.kind {
607 if use_tree.ident().name == kw::SelfLower {
608 return Some(use_tree.span);
609 }
85aaf69f 610 }
ff7c6d11 611
dfeec247
XL
612 None
613 })
614 .collect::<Vec<_>>();
ff7c6d11 615 if self_spans.len() > 1 {
416331ca 616 let mut e = self.r.into_struct_error(
ff7c6d11 617 self_spans[0],
dfeec247
XL
618 ResolutionError::SelfImportCanOnlyAppearOnceInTheList,
619 );
ff7c6d11
XL
620
621 for other_span in self_spans.iter().skip(1) {
622 e.span_label(*other_span, "another `self` import appears here");
85aaf69f 623 }
ff7c6d11
XL
624
625 e.emit();
85aaf69f 626 }
ff7c6d11
XL
627
628 for &(ref tree, id) in items {
629 self.build_reduced_graph_for_use_tree(
0bf4aa26 630 // This particular use tree
dfeec247 631 tree, id, &prefix, true, // The whole `use` item
416331ca 632 item, vis, root_span,
0bf4aa26
XL
633 );
634 }
635
636 // Empty groups `a::b::{}` are turned into synthetic `self` imports
dc9dc135 637 // `a::b::c::{self as _}`, so that their prefixes are correctly
0bf4aa26
XL
638 // resolved and checked for privacy/stability/etc.
639 if items.is_empty() && !empty_for_self(&prefix) {
13cf67c4 640 let new_span = prefix[prefix.len() - 1].ident.span;
0bf4aa26 641 let tree = ast::UseTree {
dfeec247 642 prefix: ast::Path::from_ident(Ident::new(kw::SelfLower, new_span)),
0bf4aa26 643 kind: ast::UseTreeKind::Simple(
dc9dc135 644 Some(Ident::new(kw::Underscore, new_span)),
0bf4aa26
XL
645 ast::DUMMY_NODE_ID,
646 ast::DUMMY_NODE_ID,
647 ),
648 span: use_tree.span,
649 };
650 self.build_reduced_graph_for_use_tree(
651 // This particular use tree
dfeec247
XL
652 &tree,
653 id,
654 &prefix,
655 true,
0bf4aa26 656 // The whole `use` item
dfeec247
XL
657 item,
658 ty::Visibility::Invisible,
659 root_span,
ff7c6d11
XL
660 );
661 }
662 }
663 }
664 }
665
666 /// Constructs the reduced graph for one item.
e1599b0c 667 fn build_reduced_graph_for_item(&mut self, item: &'b Item) {
5869c6ff 668 if matches!(item.kind, ItemKind::Mod(..)) && item.ident.name == kw::Empty {
29967ef6
XL
669 // Fake crate root item from expand.
670 return;
671 }
672
416331ca 673 let parent_scope = &self.parent_scope;
0bf4aa26
XL
674 let parent = parent_scope.module;
675 let expansion = parent_scope.expansion;
e74abb32 676 let ident = item.ident;
ff7c6d11
XL
677 let sp = item.span;
678 let vis = self.resolve_visibility(&item.vis);
29967ef6
XL
679 let local_def_id = self.r.local_def_id(item.id);
680 let def_id = local_def_id.to_def_id();
681
682 self.r.visibilities.insert(local_def_id, vis);
ff7c6d11 683
e74abb32 684 match item.kind {
ff7c6d11 685 ItemKind::Use(ref use_tree) => {
ff7c6d11 686 self.build_reduced_graph_for_use_tree(
0bf4aa26 687 // This particular use tree
dfeec247
XL
688 use_tree,
689 item.id,
690 &[],
691 false,
0bf4aa26 692 // The whole `use` item
dfeec247
XL
693 item,
694 vis,
695 use_tree.span,
ff7c6d11 696 );
85aaf69f
SL
697 }
698
0531ce1d 699 ItemKind::ExternCrate(orig_name) => {
dc9dc135 700 let module = if orig_name.is_none() && ident.name == kw::SelfLower {
dfeec247
XL
701 self.r
702 .session
a1dfa0c6 703 .struct_span_err(item.span, "`extern crate self;` requires renaming")
9fa01778
XL
704 .span_suggestion(
705 item.span,
706 "try",
707 "extern crate self as name;".into(),
708 Applicability::HasPlaceholders,
709 )
a1dfa0c6
XL
710 .emit();
711 return;
dc9dc135 712 } else if orig_name == Some(kw::SelfLower) {
416331ca 713 self.r.graph_root
a1dfa0c6 714 } else {
29967ef6
XL
715 let crate_id = self.r.crate_loader.process_extern_crate(
716 item,
717 &self.r.definitions,
718 local_def_id,
719 );
720 self.r.extern_crate_map.insert(local_def_id, crate_id);
416331ca 721 self.r.get_module(DefId { krate: crate_id, index: CRATE_DEF_INDEX })
a1dfa0c6
XL
722 };
723
ba9703b0 724 let used = self.process_macro_use_imports(item, module);
32a655c1 725 let binding =
416331ca 726 (module, ty::Visibility::Public, sp, expansion).to_name_binding(self.r.arenas);
74b04a01
XL
727 let import = self.r.arenas.alloc_import(Import {
728 kind: ImportKind::ExternCrate { source: orig_name, target: ident },
13cf67c4
XL
729 root_id: item.id,
730 id: item.id,
e1599b0c 731 parent_scope: self.parent_scope,
13cf67c4 732 imported_module: Cell::new(Some(ModuleOrUniformRoot::Module(module))),
9fa01778
XL
733 has_attributes: !item.attrs.is_empty(),
734 use_span_with_attributes: item.span_with_attributes(),
735 use_span: item.span,
13cf67c4
XL
736 root_span: item.span,
737 span: item.span,
738 module_path: Vec::new(),
739 vis: Cell::new(vis),
740 used: Cell::new(used),
741 });
74b04a01
XL
742 self.r.potentially_unused_imports.push(import);
743 let imported_binding = self.r.import(binding, import);
416331ca 744 if ptr::eq(parent, self.r.graph_root) {
ba9703b0
XL
745 if let Some(entry) = self.r.extern_prelude.get(&ident.normalize_to_macros_2_0())
746 {
136023e0 747 if expansion != LocalExpnId::ROOT
dfeec247
XL
748 && orig_name.is_some()
749 && entry.extern_crate_item.is_none()
750 {
416331ca
XL
751 let msg = "macro-expanded `extern crate` items cannot \
752 shadow names passed with `--extern`";
753 self.r.session.span_err(item.span, msg);
0bf4aa26
XL
754 }
755 }
dfeec247 756 let entry =
ba9703b0
XL
757 self.r.extern_prelude.entry(ident.normalize_to_macros_2_0()).or_insert(
758 ExternPreludeEntry {
759 extern_crate_item: None,
760 introduced_by_item: true,
761 },
762 );
13cf67c4 763 entry.extern_crate_item = Some(imported_binding);
0bf4aa26
XL
764 if orig_name.is_some() {
765 entry.introduced_by_item = true;
766 }
767 }
416331ca 768 self.r.define(parent, ident, TypeNS, imported_binding);
85aaf69f
SL
769 }
770
a7813a04 771 ItemKind::Mod(..) => {
29967ef6 772 let module_kind = ModuleKind::Def(DefKind::Mod, def_id, ident.name);
416331ca 773 let module = self.r.arenas.alloc_module(ModuleData {
9e0c209e 774 no_implicit_prelude: parent.no_implicit_prelude || {
3dfed10e 775 self.r.session.contains_name(&item.attrs, sym::no_implicit_prelude)
9e0c209e 776 },
136023e0
XL
777 ..ModuleData::new(
778 Some(parent),
779 module_kind,
780 def_id,
781 expansion.to_expn_id(),
782 item.span,
783 )
3157f602 784 });
416331ca 785 self.r.define(parent, ident, TypeNS, (module, vis, sp, expansion));
29967ef6 786 self.r.module_map.insert(local_def_id, module);
9e0c209e
SL
787
788 // Descend into the module.
416331ca 789 self.parent_scope.module = module;
1a4d82fc
JJ
790 }
791
1a4d82fc 792 // These items live in the value namespace.
48663c56 793 ItemKind::Static(..) => {
29967ef6 794 let res = Res::Def(DefKind::Static, def_id);
416331ca 795 self.r.define(parent, ident, ValueNS, (res, vis, sp, expansion));
1a4d82fc 796 }
9e0c209e 797 ItemKind::Const(..) => {
29967ef6 798 let res = Res::Def(DefKind::Const, def_id);
416331ca 799 self.r.define(parent, ident, ValueNS, (res, vis, sp, expansion));
1a4d82fc 800 }
9e0c209e 801 ItemKind::Fn(..) => {
29967ef6 802 let res = Res::Def(DefKind::Fn, def_id);
416331ca 803 self.r.define(parent, ident, ValueNS, (res, vis, sp, expansion));
8faf50e0
XL
804
805 // Functions introducing procedural macros reserve a slot
806 // in the macro namespace as well (see #52225).
416331ca 807 self.define_macro(item);
1a4d82fc
JJ
808 }
809
810 // These items live in the type namespace.
f035d41b 811 ItemKind::TyAlias(..) => {
29967ef6 812 let res = Res::Def(DefKind::TyAlias, def_id);
416331ca 813 self.r.define(parent, ident, TypeNS, (res, vis, sp, expansion));
8faf50e0
XL
814 }
815
e1599b0c 816 ItemKind::Enum(_, _) => {
e1599b0c 817 let module_kind = ModuleKind::Def(DefKind::Enum, def_id, ident.name);
dfeec247
XL
818 let module = self.r.new_module(
819 parent,
820 module_kind,
5869c6ff 821 parent.nearest_parent_mod,
136023e0 822 expansion.to_expn_id(),
dfeec247
XL
823 item.span,
824 );
416331ca 825 self.r.define(parent, ident, TypeNS, (module, vis, sp, expansion));
e1599b0c 826 self.parent_scope.module = module;
1a4d82fc
JJ
827 }
828
ff7c6d11 829 ItemKind::TraitAlias(..) => {
29967ef6 830 let res = Res::Def(DefKind::TraitAlias, def_id);
416331ca 831 self.r.define(parent, ident, TypeNS, (res, vis, sp, expansion));
ff7c6d11
XL
832 }
833
1a4d82fc 834 // These items live in both the type and value namespaces.
e74abb32 835 ItemKind::Struct(ref vdata, _) => {
1a4d82fc 836 // Define a name in the type namespace.
48663c56 837 let res = Res::Def(DefKind::Struct, def_id);
416331ca 838 self.r.define(parent, ident, TypeNS, (res, vis, sp, expansion));
1a4d82fc 839
abe05a73 840 // Record field names for error reporting.
e74abb32 841 self.insert_field_names_local(def_id, vdata);
8bb4bdeb
XL
842
843 // If this is a tuple or unit struct, define a name
844 // in the value namespace as well.
e74abb32 845 if let Some(ctor_node_id) = vdata.ctor_id() {
e74abb32
XL
846 // If the structure is marked as non_exhaustive then lower the visibility
847 // to within the crate.
ba9703b0 848 let mut ctor_vis = if vis == ty::Visibility::Public
3dfed10e 849 && self.r.session.contains_name(&item.attrs, sym::non_exhaustive)
dfeec247 850 {
ba9703b0
XL
851 ty::Visibility::Restricted(DefId::local(CRATE_DEF_INDEX))
852 } else {
853 vis
854 };
855
1b1a35ee
XL
856 let mut ret_fields = Vec::with_capacity(vdata.fields().len());
857
e74abb32
XL
858 for field in vdata.fields() {
859 // NOTE: The field may be an expansion placeholder, but expansion sets
860 // correct visibilities for unnamed field placeholders specifically, so the
861 // constructor visibility should still be determined correctly.
1b1a35ee
XL
862 let field_vis = self
863 .resolve_visibility_speculative(&field.vis, true)
864 .unwrap_or(ty::Visibility::Public);
865 if ctor_vis.is_at_least(field_vis, &*self.r) {
866 ctor_vis = field_vis;
e74abb32 867 }
1b1a35ee 868 ret_fields.push(field_vis);
e74abb32 869 }
29967ef6 870 let ctor_def_id = self.r.local_def_id(ctor_node_id);
48663c56 871 let ctor_res = Res::Def(
e74abb32 872 DefKind::Ctor(CtorOf::Struct, CtorKind::from_ast(vdata)),
29967ef6 873 ctor_def_id.to_def_id(),
48663c56 874 );
416331ca 875 self.r.define(parent, ident, ValueNS, (ctor_res, ctor_vis, sp, expansion));
29967ef6
XL
876 self.r.visibilities.insert(ctor_def_id, ctor_vis);
877
1b1a35ee 878 self.r.struct_constructors.insert(def_id, (ctor_res, ctor_vis, ret_fields));
8bb4bdeb 879 }
1a4d82fc
JJ
880 }
881
9e0c209e 882 ItemKind::Union(ref vdata, _) => {
e74abb32 883 let res = Res::Def(DefKind::Union, def_id);
416331ca 884 self.r.define(parent, ident, TypeNS, (res, vis, sp, expansion));
1a4d82fc 885
c30ab7b3 886 // Record field names for error reporting.
e74abb32 887 self.insert_field_names_local(def_id, vdata);
416331ca 888 }
1a4d82fc 889
9e0c209e 890 ItemKind::Trait(..) => {
9e0c209e 891 // Add all the items within to a new module.
48663c56 892 let module_kind = ModuleKind::Def(DefKind::Trait, def_id, ident.name);
dfeec247
XL
893 let module = self.r.new_module(
894 parent,
895 module_kind,
5869c6ff 896 parent.nearest_parent_mod,
136023e0 897 expansion.to_expn_id(),
dfeec247
XL
898 item.span,
899 );
416331ca
XL
900 self.r.define(parent, ident, TypeNS, (module, vis, sp, expansion));
901 self.parent_scope.module = module;
1a4d82fc 902 }
ff7c6d11 903
e74abb32 904 // These items do not add names to modules.
5869c6ff 905 ItemKind::Impl(box ImplKind { of_trait: Some(..), .. }) => {
29967ef6
XL
906 self.r.trait_impl_items.insert(local_def_id);
907 }
dfeec247 908 ItemKind::Impl { .. } | ItemKind::ForeignMod(..) | ItemKind::GlobalAsm(..) => {}
e74abb32 909
ba9703b0 910 ItemKind::MacroDef(..) | ItemKind::MacCall(_) => unreachable!(),
1a4d82fc
JJ
911 }
912 }
913
1a4d82fc 914 /// Constructs the reduced graph for one foreign item.
416331ca 915 fn build_reduced_graph_for_foreign_item(&mut self, item: &ForeignItem) {
29967ef6
XL
916 let local_def_id = self.r.local_def_id(item.id);
917 let def_id = local_def_id.to_def_id();
918 let (def_kind, ns) = match item.kind {
919 ForeignItemKind::Fn(..) => (DefKind::Fn, ValueNS),
920 ForeignItemKind::Static(..) => (DefKind::Static, ValueNS),
921 ForeignItemKind::TyAlias(..) => (DefKind::ForeignTy, TypeNS),
ba9703b0 922 ForeignItemKind::MacCall(_) => unreachable!(),
c34b1796 923 };
416331ca
XL
924 let parent = self.parent_scope.module;
925 let expansion = self.parent_scope.expansion;
476ff2be 926 let vis = self.resolve_visibility(&item.vis);
29967ef6 927 let res = Res::Def(def_kind, def_id);
416331ca 928 self.r.define(parent, item.ident, ns, (res, vis, item.span, expansion));
29967ef6 929 self.r.visibilities.insert(local_def_id, vis);
1a4d82fc
JJ
930 }
931
416331ca
XL
932 fn build_reduced_graph_for_block(&mut self, block: &Block) {
933 let parent = self.parent_scope.module;
934 let expansion = self.parent_scope.expansion;
1a4d82fc 935 if self.block_needs_anonymous_module(block) {
dfeec247
XL
936 let module = self.r.new_module(
937 parent,
938 ModuleKind::Block(block.id),
5869c6ff 939 parent.nearest_parent_mod,
136023e0 940 expansion.to_expn_id(),
dfeec247
XL
941 block.span,
942 );
416331ca
XL
943 self.r.block_map.insert(block.id, module);
944 self.parent_scope.module = module; // Descend into the block.
1a4d82fc
JJ
945 }
946 }
947
54a0048b 948 /// Builds the reduced graph for a single item in an external crate.
e1599b0c
XL
949 fn build_reduced_graph_for_external_crate_res(&mut self, child: Export<NodeId>) {
950 let parent = self.parent_scope.module;
48663c56 951 let Export { ident, res, vis, span } = child;
3dfed10e 952 let expansion = self.parent_scope.expansion;
e1599b0c 953 // Record primary definitions.
48663c56 954 match res {
ba9703b0 955 Res::Def(kind @ (DefKind::Mod | DefKind::Enum | DefKind::Trait), def_id) => {
e74abb32
XL
956 let module = self.r.new_module(
957 parent,
958 ModuleKind::Def(kind, def_id, ident.name),
959 def_id,
136023e0 960 expansion.to_expn_id(),
e74abb32
XL
961 span,
962 );
963 self.r.define(parent, ident, TypeNS, (module, vis, span, expansion));
c30ab7b3 964 }
ba9703b0
XL
965 Res::Def(
966 DefKind::Struct
967 | DefKind::Union
968 | DefKind::Variant
969 | DefKind::TyAlias
970 | DefKind::ForeignTy
971 | DefKind::OpaqueTy
972 | DefKind::TraitAlias
f035d41b 973 | DefKind::AssocTy,
ba9703b0
XL
974 _,
975 )
48663c56 976 | Res::PrimTy(..)
dfeec247 977 | Res::ToolMod => self.r.define(parent, ident, TypeNS, (res, vis, span, expansion)),
ba9703b0
XL
978 Res::Def(
979 DefKind::Fn
980 | DefKind::AssocFn
981 | DefKind::Static
982 | DefKind::Const
983 | DefKind::AssocConst
984 | DefKind::Ctor(..),
985 _,
986 ) => self.r.define(parent, ident, ValueNS, (res, vis, span, expansion)),
dfeec247
XL
987 Res::Def(DefKind::Macro(..), _) | Res::NonMacroAttr(..) => {
988 self.r.define(parent, ident, MacroNS, (res, vis, span, expansion))
989 }
f9f354fc
XL
990 Res::Def(
991 DefKind::TyParam
992 | DefKind::ConstParam
993 | DefKind::ExternCrate
994 | DefKind::Use
995 | DefKind::ForeignMod
996 | DefKind::AnonConst
997 | DefKind::Field
998 | DefKind::LifetimeParam
999 | DefKind::GlobalAsm
1000 | DefKind::Closure
1001 | DefKind::Impl
1002 | DefKind::Generator,
1003 _,
1004 )
dfeec247
XL
1005 | Res::Local(..)
1006 | Res::SelfTy(..)
1007 | Res::SelfCtor(..)
1008 | Res::Err => bug!("unexpected resolution: {:?}", res),
e1599b0c
XL
1009 }
1010 // Record some extra data for better diagnostics.
e74abb32 1011 let cstore = self.r.cstore();
e1599b0c 1012 match res {
17df50a5
XL
1013 Res::Def(DefKind::Struct, def_id) => {
1014 let field_names = cstore.struct_field_names_untracked(def_id, self.r.session);
1015 let ctor = cstore.ctor_def_id_and_kind_untracked(def_id);
1016 if let Some((ctor_def_id, ctor_kind)) = ctor {
1017 let ctor_res = Res::Def(DefKind::Ctor(CtorOf::Struct, ctor_kind), ctor_def_id);
1018 let ctor_vis = cstore.visibility_untracked(ctor_def_id);
1019 let field_visibilities = cstore.struct_field_visibilities_untracked(def_id);
1020 self.r
1021 .struct_constructors
1022 .insert(def_id, (ctor_res, ctor_vis, field_visibilities));
1023 }
1024 self.insert_field_names(def_id, field_names);
1025 }
1026 Res::Def(DefKind::Union, def_id) => {
e74abb32 1027 let field_names = cstore.struct_field_names_untracked(def_id, self.r.session);
c30ab7b3 1028 self.insert_field_names(def_id, field_names);
9e0c209e 1029 }
ba9703b0
XL
1030 Res::Def(DefKind::AssocFn, def_id) => {
1031 if cstore
1032 .associated_item_cloned_untracked(def_id, self.r.session)
1033 .fn_has_self_parameter
1034 {
e1599b0c
XL
1035 self.r.has_self.insert(def_id);
1036 }
1037 }
e1599b0c 1038 _ => {}
1a4d82fc
JJ
1039 }
1040 }
1041
ba9703b0 1042 fn add_macro_use_binding(
dfeec247 1043 &mut self,
f9f354fc 1044 name: Symbol,
dfeec247
XL
1045 binding: &'a NameBinding<'a>,
1046 span: Span,
1047 allow_shadowing: bool,
1048 ) {
416331ca 1049 if self.r.macro_use_prelude.insert(name, binding).is_some() && !allow_shadowing {
476ff2be
SL
1050 let msg = format!("`{}` is already in scope", name);
1051 let note =
1052 "macro-expanded `#[macro_use]`s may not shadow existing macros (see RFC 1560)";
416331ca 1053 self.r.session.struct_span_err(span, &msg).note(note).emit();
476ff2be
SL
1054 }
1055 }
c30ab7b3 1056
9fa01778 1057 /// Returns `true` if we should consider the underlying `extern crate` to be used.
ba9703b0 1058 fn process_macro_use_imports(&mut self, item: &Item, module: Module<'a>) -> bool {
0bf4aa26
XL
1059 let mut import_all = None;
1060 let mut single_imports = Vec::new();
1061 for attr in &item.attrs {
3dfed10e 1062 if self.r.session.check_name(attr, sym::macro_use) {
416331ca 1063 if self.parent_scope.module.parent.is_some() {
dfeec247
XL
1064 struct_span_err!(
1065 self.r.session,
1066 item.span,
1067 E0468,
1068 "an `extern crate` loading macros must be at the crate root"
1069 )
1070 .emit();
0bf4aa26 1071 }
e74abb32 1072 if let ItemKind::ExternCrate(Some(orig_name)) = item.kind {
dc9dc135 1073 if orig_name == kw::SelfLower {
dfeec247
XL
1074 self.r
1075 .session
1076 .struct_span_err(
1077 attr.span,
1078 "`#[macro_use]` is not supported on `extern crate self`",
1079 )
1080 .emit();
a1dfa0c6
XL
1081 }
1082 }
dfeec247
XL
1083 let ill_formed =
1084 |span| struct_span_err!(self.r.session, span, E0466, "bad macro import").emit();
0bf4aa26 1085 match attr.meta() {
e74abb32 1086 Some(meta) => match meta.kind {
0bf4aa26
XL
1087 MetaItemKind::Word => {
1088 import_all = Some(meta.span);
1089 break;
1090 }
dfeec247
XL
1091 MetaItemKind::List(nested_metas) => {
1092 for nested_meta in nested_metas {
1093 match nested_meta.ident() {
1094 Some(ident) if nested_meta.is_word() => {
1095 single_imports.push(ident)
1096 }
1097 _ => ill_formed(nested_meta.span()),
1098 }
0bf4aa26
XL
1099 }
1100 }
1101 MetaItemKind::NameValue(..) => ill_formed(meta.span),
dfeec247 1102 },
532ac7d7 1103 None => ill_formed(attr.span),
0bf4aa26
XL
1104 }
1105 }
476ff2be 1106 }
c30ab7b3 1107
74b04a01
XL
1108 let macro_use_import = |this: &Self, span| {
1109 this.r.arenas.alloc_import(Import {
1110 kind: ImportKind::MacroUse,
dfeec247
XL
1111 root_id: item.id,
1112 id: item.id,
1113 parent_scope: this.parent_scope,
1114 imported_module: Cell::new(Some(ModuleOrUniformRoot::Module(module))),
dfeec247
XL
1115 use_span_with_attributes: item.span_with_attributes(),
1116 has_attributes: !item.attrs.is_empty(),
1117 use_span: item.span,
1118 root_span: span,
1119 span,
1120 module_path: Vec::new(),
1121 vis: Cell::new(ty::Visibility::Restricted(DefId::local(CRATE_DEF_INDEX))),
1122 used: Cell::new(false),
1123 })
1124 };
32a655c1 1125
136023e0 1126 let allow_shadowing = self.parent_scope.expansion == LocalExpnId::ROOT;
0bf4aa26 1127 if let Some(span) = import_all {
74b04a01
XL
1128 let import = macro_use_import(self, span);
1129 self.r.potentially_unused_imports.push(import);
dfeec247
XL
1130 module.for_each_child(self, |this, ident, ns, binding| {
1131 if ns == MacroNS {
74b04a01 1132 let imported_binding = this.r.import(binding, import);
ba9703b0 1133 this.add_macro_use_binding(ident.name, imported_binding, span, allow_shadowing);
dfeec247 1134 }
476ff2be
SL
1135 });
1136 } else {
9fa01778 1137 for ident in single_imports.iter().cloned() {
416331ca 1138 let result = self.r.resolve_ident_in_module(
b7449926
XL
1139 ModuleOrUniformRoot::Module(module),
1140 ident,
1141 MacroNS,
416331ca 1142 &self.parent_scope,
b7449926 1143 false,
9fa01778 1144 ident.span,
b7449926 1145 );
476ff2be 1146 if let Ok(binding) = result {
74b04a01
XL
1147 let import = macro_use_import(self, ident.span);
1148 self.r.potentially_unused_imports.push(import);
1149 let imported_binding = self.r.import(binding, import);
ba9703b0 1150 self.add_macro_use_binding(
dfeec247
XL
1151 ident.name,
1152 imported_binding,
1153 ident.span,
1154 allow_shadowing,
1155 );
c30ab7b3 1156 } else {
dfeec247
XL
1157 struct_span_err!(self.r.session, ident.span, E0469, "imported macro not found")
1158 .emit();
c30ab7b3
SL
1159 }
1160 }
476ff2be 1161 }
0bf4aa26 1162 import_all.is_some() || !single_imports.is_empty()
c30ab7b3
SL
1163 }
1164
9fa01778 1165 /// Returns `true` if this attribute list contains `macro_use`.
c30ab7b3
SL
1166 fn contains_macro_use(&mut self, attrs: &[ast::Attribute]) -> bool {
1167 for attr in attrs {
3dfed10e 1168 if self.r.session.check_name(attr, sym::macro_escape) {
dfeec247 1169 let msg = "`#[macro_escape]` is a deprecated synonym for `#[macro_use]`";
416331ca 1170 let mut err = self.r.session.struct_span_warn(attr.span, msg);
476ff2be 1171 if let ast::AttrStyle::Inner = attr.style {
dfeec247 1172 err.help("try an outer attribute: `#[macro_use]`").emit();
c30ab7b3
SL
1173 } else {
1174 err.emit();
1175 }
3dfed10e 1176 } else if !self.r.session.check_name(attr, sym::macro_use) {
c30ab7b3
SL
1177 continue;
1178 }
1179
1180 if !attr.is_word() {
dfeec247 1181 self.r.session.span_err(attr.span, "arguments to `macro_use` are not allowed here");
c30ab7b3
SL
1182 }
1183 return true;
1184 }
1185
1186 false
1187 }
1a4d82fc 1188
136023e0 1189 fn visit_invoc(&mut self, id: NodeId) -> LocalExpnId {
416331ca 1190 let invoc_id = id.placeholder_to_expn_id();
e1599b0c
XL
1191 let old_parent_scope = self.r.invocation_parent_scopes.insert(invoc_id, self.parent_scope);
1192 assert!(old_parent_scope.is_none(), "invocation data is reset for an invocation");
fc512014
XL
1193 invoc_id
1194 }
416331ca 1195
fc512014
XL
1196 /// Visit invocation in context in which it can emit a named item (possibly `macro_rules`)
1197 /// directly into its parent scope's module.
1198 fn visit_invoc_in_module(&mut self, id: NodeId) -> MacroRulesScopeRef<'a> {
1199 let invoc_id = self.visit_invoc(id);
1200 self.parent_scope.module.unexpanded_invocations.borrow_mut().insert(invoc_id);
1201 self.r.arenas.alloc_macro_rules_scope(MacroRulesScope::Invocation(invoc_id))
416331ca
XL
1202 }
1203
3dfed10e
XL
1204 fn proc_macro_stub(&self, item: &ast::Item) -> Option<(MacroKind, Ident, Span)> {
1205 if self.r.session.contains_name(&item.attrs, sym::proc_macro) {
416331ca 1206 return Some((MacroKind::Bang, item.ident, item.span));
3dfed10e 1207 } else if self.r.session.contains_name(&item.attrs, sym::proc_macro_attribute) {
416331ca 1208 return Some((MacroKind::Attr, item.ident, item.span));
3dfed10e
XL
1209 } else if let Some(attr) = self.r.session.find_by_name(&item.attrs, sym::proc_macro_derive)
1210 {
416331ca
XL
1211 if let Some(nested_meta) = attr.meta_item_list().and_then(|list| list.get(0).cloned()) {
1212 if let Some(ident) = nested_meta.ident() {
1213 return Some((MacroKind::Derive, ident, ident.span));
1214 }
1215 }
1216 }
1217 None
1218 }
1219
e74abb32
XL
1220 // Mark the given macro as unused unless its name starts with `_`.
1221 // Macro uses will remove items from this set, and the remaining
1222 // items will be reported as `unused_macros`.
f9f354fc
XL
1223 fn insert_unused_macro(
1224 &mut self,
1225 ident: Ident,
1226 def_id: LocalDefId,
1227 node_id: NodeId,
1228 span: Span,
1229 ) {
74b04a01 1230 if !ident.as_str().starts_with('_') {
f9f354fc 1231 self.r.unused_macros.insert(def_id, (node_id, span));
e74abb32
XL
1232 }
1233 }
1234
29967ef6 1235 fn define_macro(&mut self, item: &ast::Item) -> MacroRulesScopeRef<'a> {
e74abb32 1236 let parent_scope = self.parent_scope;
416331ca 1237 let expansion = parent_scope.expansion;
f035d41b 1238 let def_id = self.r.local_def_id(item.id);
ba9703b0 1239 let (ext, ident, span, macro_rules) = match &item.kind {
416331ca 1240 ItemKind::MacroDef(def) => {
e1599b0c 1241 let ext = Lrc::new(self.r.compile_macro(item, self.r.session.edition()));
ba9703b0 1242 (ext, item.ident, item.span, def.macro_rules)
416331ca 1243 }
3dfed10e 1244 ItemKind::Fn(..) => match self.proc_macro_stub(item) {
416331ca 1245 Some((macro_kind, ident, span)) => {
f9f354fc 1246 self.r.proc_macro_stubs.insert(def_id);
416331ca
XL
1247 (self.r.dummy_ext(macro_kind), ident, span, false)
1248 }
ba9703b0 1249 None => return parent_scope.macro_rules,
dfeec247 1250 },
416331ca
XL
1251 _ => unreachable!(),
1252 };
1253
f9f354fc
XL
1254 let res = Res::Def(DefKind::Macro(ext.macro_kind()), def_id.to_def_id());
1255 self.r.macro_map.insert(def_id.to_def_id(), ext);
1256 self.r.local_macro_def_scopes.insert(def_id, parent_scope.module);
416331ca 1257
cdc7bbd5 1258 if macro_rules {
ba9703b0 1259 let ident = ident.normalize_to_macros_2_0();
416331ca 1260 self.r.macro_names.insert(ident);
cdc7bbd5 1261 let is_macro_export = self.r.session.contains_name(&item.attrs, sym::macro_export);
416331ca
XL
1262 let vis = if is_macro_export {
1263 ty::Visibility::Public
1264 } else {
1265 ty::Visibility::Restricted(DefId::local(CRATE_DEF_INDEX))
1266 };
1267 let binding = (res, vis, span, expansion).to_name_binding(self.r.arenas);
1268 self.r.set_binding_parent_module(binding, parent_scope.module);
1269 self.r.all_macros.insert(ident.name, res);
1270 if is_macro_export {
1271 let module = self.r.graph_root;
dfeec247 1272 self.r.define(module, ident, MacroNS, (res, vis, span, expansion, IsMacroExport));
416331ca
XL
1273 } else {
1274 self.r.check_reserved_macro_name(ident, res);
f9f354fc 1275 self.insert_unused_macro(ident, def_id, item.id, span);
416331ca 1276 }
29967ef6
XL
1277 self.r.visibilities.insert(def_id, vis);
1278 self.r.arenas.alloc_macro_rules_scope(MacroRulesScope::Binding(
1279 self.r.arenas.alloc_macro_rules_binding(MacroRulesBinding {
1280 parent_macro_rules_scope: parent_scope.macro_rules,
1281 binding,
1282 ident,
1283 }),
1284 ))
416331ca
XL
1285 } else {
1286 let module = parent_scope.module;
ba9703b0
XL
1287 let vis = match item.kind {
1288 // Visibilities must not be resolved non-speculatively twice
1289 // and we already resolved this one as a `fn` item visibility.
1290 ItemKind::Fn(..) => self
1291 .resolve_visibility_speculative(&item.vis, true)
1292 .unwrap_or(ty::Visibility::Public),
1293 _ => self.resolve_visibility(&item.vis),
1294 };
416331ca 1295 if vis != ty::Visibility::Public {
f9f354fc 1296 self.insert_unused_macro(ident, def_id, item.id, span);
416331ca
XL
1297 }
1298 self.r.define(module, ident, MacroNS, (res, vis, span, expansion));
29967ef6 1299 self.r.visibilities.insert(def_id, vis);
ba9703b0 1300 self.parent_scope.macro_rules
416331ca 1301 }
c30ab7b3
SL
1302 }
1303}
1304
1305macro_rules! method {
1306 ($visit:ident: $ty:ty, $invoc:path, $walk:ident) => {
416331ca 1307 fn $visit(&mut self, node: &'b $ty) {
e74abb32 1308 if let $invoc(..) = node.kind {
c30ab7b3
SL
1309 self.visit_invoc(node.id);
1310 } else {
1311 visit::$walk(self, node);
1312 }
1313 }
ba9703b0 1314 };
1a4d82fc
JJ
1315}
1316
416331ca 1317impl<'a, 'b> Visitor<'b> for BuildReducedGraphVisitor<'a, 'b> {
ba9703b0
XL
1318 method!(visit_expr: ast::Expr, ast::ExprKind::MacCall, walk_expr);
1319 method!(visit_pat: ast::Pat, ast::PatKind::MacCall, walk_pat);
1320 method!(visit_ty: ast::Ty, ast::TyKind::MacCall, walk_ty);
c30ab7b3 1321
416331ca 1322 fn visit_item(&mut self, item: &'b Item) {
5869c6ff
XL
1323 let orig_module_scope = self.parent_scope.module;
1324 self.parent_scope.macro_rules = match item.kind {
8bb4bdeb 1325 ItemKind::MacroDef(..) => {
5869c6ff
XL
1326 let macro_rules_scope = self.define_macro(item);
1327 visit::walk_item(self, item);
1328 macro_rules_scope
8bb4bdeb 1329 }
ba9703b0 1330 ItemKind::MacCall(..) => {
5869c6ff
XL
1331 let macro_rules_scope = self.visit_invoc_in_module(item.id);
1332 visit::walk_item(self, item);
1333 macro_rules_scope
1334 }
1335 _ => {
1336 let orig_macro_rules_scope = self.parent_scope.macro_rules;
1337 self.build_reduced_graph_for_item(item);
1338 visit::walk_item(self, item);
1339 match item.kind {
1340 ItemKind::Mod(..) if self.contains_macro_use(&item.attrs) => {
1341 self.parent_scope.macro_rules
1342 }
1343 _ => orig_macro_rules_scope,
1344 }
c30ab7b3 1345 }
c30ab7b3 1346 };
5869c6ff 1347 self.parent_scope.module = orig_module_scope;
c30ab7b3
SL
1348 }
1349
416331ca 1350 fn visit_stmt(&mut self, stmt: &'b ast::Stmt) {
ba9703b0 1351 if let ast::StmtKind::MacCall(..) = stmt.kind {
fc512014 1352 self.parent_scope.macro_rules = self.visit_invoc_in_module(stmt.id);
c30ab7b3
SL
1353 } else {
1354 visit::walk_stmt(self, stmt);
1355 }
1a4d82fc
JJ
1356 }
1357
416331ca 1358 fn visit_foreign_item(&mut self, foreign_item: &'b ForeignItem) {
ba9703b0 1359 if let ForeignItemKind::MacCall(_) = foreign_item.kind {
fc512014 1360 self.visit_invoc_in_module(foreign_item.id);
83c7162d
XL
1361 return;
1362 }
1363
416331ca 1364 self.build_reduced_graph_for_foreign_item(foreign_item);
c30ab7b3 1365 visit::walk_foreign_item(self, foreign_item);
1a4d82fc
JJ
1366 }
1367
416331ca
XL
1368 fn visit_block(&mut self, block: &'b Block) {
1369 let orig_current_module = self.parent_scope.module;
ba9703b0 1370 let orig_current_macro_rules_scope = self.parent_scope.macro_rules;
416331ca 1371 self.build_reduced_graph_for_block(block);
a7813a04 1372 visit::walk_block(self, block);
416331ca 1373 self.parent_scope.module = orig_current_module;
ba9703b0 1374 self.parent_scope.macro_rules = orig_current_macro_rules_scope;
9e0c209e
SL
1375 }
1376
74b04a01 1377 fn visit_assoc_item(&mut self, item: &'b AssocItem, ctxt: AssocCtxt) {
ba9703b0 1378 if let AssocItemKind::MacCall(_) = item.kind {
fc512014
XL
1379 match ctxt {
1380 AssocCtxt::Trait => {
1381 self.visit_invoc_in_module(item.id);
1382 }
1383 AssocCtxt::Impl => {
1384 self.visit_invoc(item.id);
1385 }
1386 }
dfeec247 1387 return;
c30ab7b3
SL
1388 }
1389
6a06907d 1390 let vis = self.resolve_visibility(&item.vis);
29967ef6
XL
1391 let local_def_id = self.r.local_def_id(item.id);
1392 let def_id = local_def_id.to_def_id();
74b04a01 1393
6a06907d
XL
1394 if !(ctxt == AssocCtxt::Impl
1395 && matches!(item.vis.kind, ast::VisibilityKind::Inherited)
1396 && self
1397 .r
1398 .trait_impl_items
1399 .contains(&ty::DefIdTree::parent(&*self.r, def_id).unwrap().expect_local()))
1400 {
1401 // Trait impl item visibility is inherited from its trait when not specified
1402 // explicitly. In that case we cannot determine it here in early resolve,
1403 // so we leave a hole in the visibility table to be filled later.
1404 self.r.visibilities.insert(local_def_id, vis);
1405 }
1406
1407 if ctxt == AssocCtxt::Trait {
1408 let (def_kind, ns) = match item.kind {
1409 AssocItemKind::Const(..) => (DefKind::AssocConst, ValueNS),
1410 AssocItemKind::Fn(box FnKind(_, ref sig, _, _)) => {
1411 if sig.decl.has_self() {
1412 self.r.has_self.insert(def_id);
29967ef6 1413 }
6a06907d 1414 (DefKind::AssocFn, ValueNS)
7cac9316 1415 }
6a06907d
XL
1416 AssocItemKind::TyAlias(..) => (DefKind::AssocTy, TypeNS),
1417 AssocItemKind::MacCall(_) => bug!(), // handled above
1418 };
9e0c209e 1419
6a06907d
XL
1420 let parent = self.parent_scope.module;
1421 let expansion = self.parent_scope.expansion;
1422 let res = Res::Def(def_kind, def_id);
1423 self.r.define(parent, item.ident, ns, (res, vis, item.span, expansion));
29967ef6 1424 }
9e0c209e 1425
74b04a01 1426 visit::walk_assoc_item(self, item, ctxt);
e74abb32
XL
1427 }
1428
416331ca 1429 fn visit_attribute(&mut self, attr: &'b ast::Attribute) {
60c5eb7d 1430 if !attr.is_doc_comment() && attr::is_builtin_attr(attr) {
dfeec247
XL
1431 self.r
1432 .builtin_attrs
1433 .push((attr.get_normal_item().path.segments[0].ident, self.parent_scope));
b7449926
XL
1434 }
1435 visit::walk_attribute(self, attr);
1436 }
e1599b0c
XL
1437
1438 fn visit_arm(&mut self, arm: &'b ast::Arm) {
1439 if arm.is_placeholder {
1440 self.visit_invoc(arm.id);
1441 } else {
1442 visit::walk_arm(self, arm);
1443 }
1444 }
1445
6a06907d 1446 fn visit_expr_field(&mut self, f: &'b ast::ExprField) {
e1599b0c
XL
1447 if f.is_placeholder {
1448 self.visit_invoc(f.id);
1449 } else {
6a06907d 1450 visit::walk_expr_field(self, f);
e1599b0c
XL
1451 }
1452 }
1453
6a06907d 1454 fn visit_pat_field(&mut self, fp: &'b ast::PatField) {
e1599b0c
XL
1455 if fp.is_placeholder {
1456 self.visit_invoc(fp.id);
1457 } else {
6a06907d 1458 visit::walk_pat_field(self, fp);
e1599b0c
XL
1459 }
1460 }
1461
1462 fn visit_generic_param(&mut self, param: &'b ast::GenericParam) {
1463 if param.is_placeholder {
1464 self.visit_invoc(param.id);
1465 } else {
1466 visit::walk_generic_param(self, param);
1467 }
1468 }
1469
1470 fn visit_param(&mut self, p: &'b ast::Param) {
1471 if p.is_placeholder {
1472 self.visit_invoc(p.id);
1473 } else {
1474 visit::walk_param(self, p);
1475 }
1476 }
1477
6a06907d 1478 fn visit_field_def(&mut self, sf: &'b ast::FieldDef) {
e1599b0c
XL
1479 if sf.is_placeholder {
1480 self.visit_invoc(sf.id);
1481 } else {
29967ef6
XL
1482 let vis = self.resolve_visibility(&sf.vis);
1483 self.r.visibilities.insert(self.r.local_def_id(sf.id), vis);
6a06907d 1484 visit::walk_field_def(self, sf);
e1599b0c
XL
1485 }
1486 }
1487
1488 // Constructs the reduced graph for one variant. Variants exist in the
1489 // type and value namespaces.
1490 fn visit_variant(&mut self, variant: &'b ast::Variant) {
1491 if variant.is_placeholder {
fc512014 1492 self.visit_invoc_in_module(variant.id);
e1599b0c
XL
1493 return;
1494 }
1495
1496 let parent = self.parent_scope.module;
e1599b0c
XL
1497 let expn_id = self.parent_scope.expansion;
1498 let ident = variant.ident;
1499
1500 // Define a name in the type namespace.
29967ef6
XL
1501 let def_id = self.r.local_def_id(variant.id);
1502 let res = Res::Def(DefKind::Variant, def_id.to_def_id());
6a06907d 1503 let vis = self.resolve_visibility(&variant.vis);
e1599b0c 1504 self.r.define(parent, ident, TypeNS, (res, vis, variant.span, expn_id));
29967ef6 1505 self.r.visibilities.insert(def_id, vis);
e1599b0c 1506
29967ef6
XL
1507 // If the variant is marked as non_exhaustive then lower the visibility to within the crate.
1508 let ctor_vis = if vis == ty::Visibility::Public
1509 && self.r.session.contains_name(&variant.attrs, sym::non_exhaustive)
1510 {
1511 ty::Visibility::Restricted(DefId::local(CRATE_DEF_INDEX))
1512 } else {
1513 vis
1514 };
e1599b0c
XL
1515
1516 // Define a constructor name in the value namespace.
1517 // Braced variants, unlike structs, generate unusable names in
1518 // value namespace, they are reserved for possible future use.
1519 // It's ok to use the variant's id as a ctor id since an
1520 // error will be reported on any use of such resolution anyway.
1521 let ctor_node_id = variant.data.ctor_id().unwrap_or(variant.id);
29967ef6 1522 let ctor_def_id = self.r.local_def_id(ctor_node_id);
e1599b0c 1523 let ctor_kind = CtorKind::from_ast(&variant.data);
29967ef6 1524 let ctor_res = Res::Def(DefKind::Ctor(CtorOf::Variant, ctor_kind), ctor_def_id.to_def_id());
e1599b0c 1525 self.r.define(parent, ident, ValueNS, (ctor_res, ctor_vis, variant.span, expn_id));
29967ef6
XL
1526 if ctor_def_id != def_id {
1527 self.r.visibilities.insert(ctor_def_id, ctor_vis);
1528 }
3dfed10e 1529 // Record field names for error reporting.
29967ef6 1530 self.insert_field_names_local(ctor_def_id.to_def_id(), &variant.data);
e1599b0c
XL
1531
1532 visit::walk_variant(self, variant);
1533 }
1a4d82fc 1534}