]> git.proxmox.com Git - rustc.git/blob - src/librustc_resolve/lib.rs
New upstream version 1.40.0+dfsg1
[rustc.git] / src / librustc_resolve / lib.rs
1 //! This crate is responsible for the part of name resolution that doesn't require type checker.
2 //!
3 //! Module structure of the crate is built here.
4 //! Paths in macros, imports, expressions, types, patterns are resolved here.
5 //! Label names are resolved here as well.
6 //!
7 //! Type-relative name resolution (methods, fields, associated items) happens in `librustc_typeck`.
8 //! Lifetime names are resolved in `librustc/middle/resolve_lifetime.rs`.
9
10 #![doc(html_root_url = "https://doc.rust-lang.org/nightly/")]
11
12 #![feature(crate_visibility_modifier)]
13 #![feature(label_break_value)]
14 #![feature(nll)]
15
16 #![recursion_limit="256"]
17
18 pub use rustc::hir::def::{Namespace, PerNS};
19
20 use Determinacy::*;
21
22 use rustc::hir::map::Definitions;
23 use rustc::hir::{self, PrimTy, Bool, Char, Float, Int, Uint, Str};
24 use rustc::middle::cstore::{CrateStore, MetadataLoaderDyn};
25 use rustc::session::Session;
26 use rustc::lint;
27 use rustc::hir::def::{self, DefKind, PartialRes, CtorKind, CtorOf, NonMacroAttrKind, ExportMap};
28 use rustc::hir::def::Namespace::*;
29 use rustc::hir::def_id::{CRATE_DEF_INDEX, LOCAL_CRATE, CrateNum, DefId};
30 use rustc::hir::{TraitMap, GlobMap};
31 use rustc::ty::{self, DefIdTree, ResolverOutputs};
32 use rustc::util::nodemap::{NodeMap, NodeSet, FxHashMap, FxHashSet, DefIdMap};
33 use rustc::span_bug;
34
35 use rustc_metadata::creader::CrateLoader;
36 use rustc_metadata::cstore::CStore;
37
38 use syntax::{struct_span_err, unwrap_or};
39 use syntax::expand::SpecialDerives;
40 use syntax::ast::{self, Name, NodeId, Ident, FloatTy, IntTy, UintTy};
41 use syntax::ast::{CRATE_NODE_ID, Crate};
42 use syntax::ast::{ItemKind, Path};
43 use syntax::attr;
44 use syntax::print::pprust;
45 use syntax::symbol::{kw, sym};
46 use syntax::source_map::Spanned;
47 use syntax::visit::{self, Visitor};
48 use syntax_expand::base::SyntaxExtension;
49 use syntax_pos::hygiene::{MacroKind, ExpnId, Transparency, SyntaxContext};
50 use syntax_pos::{Span, DUMMY_SP};
51 use errors::{Applicability, DiagnosticBuilder};
52
53 use log::debug;
54
55 use std::cell::{Cell, RefCell};
56 use std::{cmp, fmt, iter, ptr};
57 use std::collections::BTreeSet;
58 use rustc_data_structures::ptr_key::PtrKey;
59 use rustc_data_structures::sync::Lrc;
60 use rustc_data_structures::fx::FxIndexMap;
61
62 use diagnostics::{Suggestion, ImportSuggestion};
63 use diagnostics::{find_span_of_binding_until_next_binding, extend_span_to_previous_binding};
64 use late::{HasGenericParams, PathSource, Rib, RibKind::*};
65 use resolve_imports::{ImportDirective, ImportDirectiveSubclass, NameResolution, ImportResolver};
66 use macros::{LegacyBinding, LegacyScope};
67
68 type Res = def::Res<NodeId>;
69
70 pub mod error_codes;
71 mod diagnostics;
72 mod late;
73 mod macros;
74 mod check_unused;
75 mod build_reduced_graph;
76 mod resolve_imports;
77
78 const KNOWN_TOOLS: &[Name] = &[sym::clippy, sym::rustfmt];
79
80 enum Weak {
81 Yes,
82 No,
83 }
84
85 #[derive(Copy, Clone, PartialEq, Debug)]
86 pub enum Determinacy {
87 Determined,
88 Undetermined,
89 }
90
91 impl Determinacy {
92 fn determined(determined: bool) -> Determinacy {
93 if determined { Determinacy::Determined } else { Determinacy::Undetermined }
94 }
95 }
96
97 /// A specific scope in which a name can be looked up.
98 /// This enum is currently used only for early resolution (imports and macros),
99 /// but not for late resolution yet.
100 #[derive(Clone, Copy)]
101 enum Scope<'a> {
102 DeriveHelpers,
103 MacroRules(LegacyScope<'a>),
104 CrateRoot,
105 Module(Module<'a>),
106 MacroUsePrelude,
107 BuiltinAttrs,
108 LegacyPluginHelpers,
109 ExternPrelude,
110 ToolPrelude,
111 StdLibPrelude,
112 BuiltinTypes,
113 }
114
115 /// Names from different contexts may want to visit different subsets of all specific scopes
116 /// with different restrictions when looking up the resolution.
117 /// This enum is currently used only for early resolution (imports and macros),
118 /// but not for late resolution yet.
119 enum ScopeSet {
120 /// All scopes with the given namespace.
121 All(Namespace, /*is_import*/ bool),
122 /// Crate root, then extern prelude (used for mixed 2015-2018 mode in macros).
123 AbsolutePath(Namespace),
124 /// All scopes with macro namespace and the given macro kind restriction.
125 Macro(MacroKind),
126 }
127
128 /// Everything you need to know about a name's location to resolve it.
129 /// Serves as a starting point for the scope visitor.
130 /// This struct is currently used only for early resolution (imports and macros),
131 /// but not for late resolution yet.
132 #[derive(Clone, Copy, Debug)]
133 pub struct ParentScope<'a> {
134 module: Module<'a>,
135 expansion: ExpnId,
136 legacy: LegacyScope<'a>,
137 derives: &'a [ast::Path],
138 }
139
140 impl<'a> ParentScope<'a> {
141 /// Creates a parent scope with the passed argument used as the module scope component,
142 /// and other scope components set to default empty values.
143 pub fn module(module: Module<'a>) -> ParentScope<'a> {
144 ParentScope {
145 module,
146 expansion: ExpnId::root(),
147 legacy: LegacyScope::Empty,
148 derives: &[],
149 }
150 }
151 }
152
153 #[derive(Eq)]
154 struct BindingError {
155 name: Name,
156 origin: BTreeSet<Span>,
157 target: BTreeSet<Span>,
158 could_be_path: bool
159 }
160
161 impl PartialOrd for BindingError {
162 fn partial_cmp(&self, other: &BindingError) -> Option<cmp::Ordering> {
163 Some(self.cmp(other))
164 }
165 }
166
167 impl PartialEq for BindingError {
168 fn eq(&self, other: &BindingError) -> bool {
169 self.name == other.name
170 }
171 }
172
173 impl Ord for BindingError {
174 fn cmp(&self, other: &BindingError) -> cmp::Ordering {
175 self.name.cmp(&other.name)
176 }
177 }
178
179 enum ResolutionError<'a> {
180 /// Error E0401: can't use type or const parameters from outer function.
181 GenericParamsFromOuterFunction(Res, HasGenericParams),
182 /// Error E0403: the name is already used for a type or const parameter in this generic
183 /// parameter list.
184 NameAlreadyUsedInParameterList(Name, Span),
185 /// Error E0407: method is not a member of trait.
186 MethodNotMemberOfTrait(Name, &'a str),
187 /// Error E0437: type is not a member of trait.
188 TypeNotMemberOfTrait(Name, &'a str),
189 /// Error E0438: const is not a member of trait.
190 ConstNotMemberOfTrait(Name, &'a str),
191 /// Error E0408: variable `{}` is not bound in all patterns.
192 VariableNotBoundInPattern(&'a BindingError),
193 /// Error E0409: variable `{}` is bound in inconsistent ways within the same match arm.
194 VariableBoundWithDifferentMode(Name, Span),
195 /// Error E0415: identifier is bound more than once in this parameter list.
196 IdentifierBoundMoreThanOnceInParameterList(&'a str),
197 /// Error E0416: identifier is bound more than once in the same pattern.
198 IdentifierBoundMoreThanOnceInSamePattern(&'a str),
199 /// Error E0426: use of undeclared label.
200 UndeclaredLabel(&'a str, Option<Name>),
201 /// Error E0429: `self` imports are only allowed within a `{ }` list.
202 SelfImportsOnlyAllowedWithin,
203 /// Error E0430: `self` import can only appear once in the list.
204 SelfImportCanOnlyAppearOnceInTheList,
205 /// Error E0431: `self` import can only appear in an import list with a non-empty prefix.
206 SelfImportOnlyInImportListWithNonEmptyPrefix,
207 /// Error E0433: failed to resolve.
208 FailedToResolve { label: String, suggestion: Option<Suggestion> },
209 /// Error E0434: can't capture dynamic environment in a fn item.
210 CannotCaptureDynamicEnvironmentInFnItem,
211 /// Error E0435: attempt to use a non-constant value in a constant.
212 AttemptToUseNonConstantValueInConstant,
213 /// Error E0530: `X` bindings cannot shadow `Y`s.
214 BindingShadowsSomethingUnacceptable(&'a str, Name, &'a NameBinding<'a>),
215 /// Error E0128: type parameters with a default cannot use forward-declared identifiers.
216 ForwardDeclaredTyParam, // FIXME(const_generics:defaults)
217 /// Error E0735: type parameters with a default cannot use `Self`
218 SelfInTyParamDefault,
219 }
220
221 enum VisResolutionError<'a> {
222 Relative2018(Span, &'a ast::Path),
223 AncestorOnly(Span),
224 FailedToResolve(Span, String, Option<Suggestion>),
225 ExpectedFound(Span, String, Res),
226 Indeterminate(Span),
227 ModuleOnly(Span),
228 }
229
230 // A minimal representation of a path segment. We use this in resolve because
231 // we synthesize 'path segments' which don't have the rest of an AST or HIR
232 // `PathSegment`.
233 #[derive(Clone, Copy, Debug)]
234 pub struct Segment {
235 ident: Ident,
236 id: Option<NodeId>,
237 }
238
239 impl Segment {
240 fn from_path(path: &Path) -> Vec<Segment> {
241 path.segments.iter().map(|s| s.into()).collect()
242 }
243
244 fn from_ident(ident: Ident) -> Segment {
245 Segment {
246 ident,
247 id: None,
248 }
249 }
250
251 fn names_to_string(segments: &[Segment]) -> String {
252 names_to_string(&segments.iter()
253 .map(|seg| seg.ident.name)
254 .collect::<Vec<_>>())
255 }
256 }
257
258 impl<'a> From<&'a ast::PathSegment> for Segment {
259 fn from(seg: &'a ast::PathSegment) -> Segment {
260 Segment {
261 ident: seg.ident,
262 id: Some(seg.id),
263 }
264 }
265 }
266
267 struct UsePlacementFinder {
268 target_module: NodeId,
269 span: Option<Span>,
270 found_use: bool,
271 }
272
273 impl UsePlacementFinder {
274 fn check(krate: &Crate, target_module: NodeId) -> (Option<Span>, bool) {
275 let mut finder = UsePlacementFinder {
276 target_module,
277 span: None,
278 found_use: false,
279 };
280 visit::walk_crate(&mut finder, krate);
281 (finder.span, finder.found_use)
282 }
283 }
284
285 impl<'tcx> Visitor<'tcx> for UsePlacementFinder {
286 fn visit_mod(
287 &mut self,
288 module: &'tcx ast::Mod,
289 _: Span,
290 _: &[ast::Attribute],
291 node_id: NodeId,
292 ) {
293 if self.span.is_some() {
294 return;
295 }
296 if node_id != self.target_module {
297 visit::walk_mod(self, module);
298 return;
299 }
300 // find a use statement
301 for item in &module.items {
302 match item.kind {
303 ItemKind::Use(..) => {
304 // don't suggest placing a use before the prelude
305 // import or other generated ones
306 if !item.span.from_expansion() {
307 self.span = Some(item.span.shrink_to_lo());
308 self.found_use = true;
309 return;
310 }
311 },
312 // don't place use before extern crate
313 ItemKind::ExternCrate(_) => {}
314 // but place them before the first other item
315 _ => if self.span.map_or(true, |span| item.span < span ) {
316 if !item.span.from_expansion() {
317 // don't insert between attributes and an item
318 if item.attrs.is_empty() {
319 self.span = Some(item.span.shrink_to_lo());
320 } else {
321 // find the first attribute on the item
322 for attr in &item.attrs {
323 if self.span.map_or(true, |span| attr.span < span) {
324 self.span = Some(attr.span.shrink_to_lo());
325 }
326 }
327 }
328 }
329 },
330 }
331 }
332 }
333 }
334
335 /// An intermediate resolution result.
336 ///
337 /// This refers to the thing referred by a name. The difference between `Res` and `Item` is that
338 /// items are visible in their whole block, while `Res`es only from the place they are defined
339 /// forward.
340 #[derive(Debug)]
341 enum LexicalScopeBinding<'a> {
342 Item(&'a NameBinding<'a>),
343 Res(Res),
344 }
345
346 impl<'a> LexicalScopeBinding<'a> {
347 fn item(self) -> Option<&'a NameBinding<'a>> {
348 match self {
349 LexicalScopeBinding::Item(binding) => Some(binding),
350 _ => None,
351 }
352 }
353
354 fn res(self) -> Res {
355 match self {
356 LexicalScopeBinding::Item(binding) => binding.res(),
357 LexicalScopeBinding::Res(res) => res,
358 }
359 }
360 }
361
362 #[derive(Copy, Clone, Debug)]
363 enum ModuleOrUniformRoot<'a> {
364 /// Regular module.
365 Module(Module<'a>),
366
367 /// Virtual module that denotes resolution in crate root with fallback to extern prelude.
368 CrateRootAndExternPrelude,
369
370 /// Virtual module that denotes resolution in extern prelude.
371 /// Used for paths starting with `::` on 2018 edition.
372 ExternPrelude,
373
374 /// Virtual module that denotes resolution in current scope.
375 /// Used only for resolving single-segment imports. The reason it exists is that import paths
376 /// are always split into two parts, the first of which should be some kind of module.
377 CurrentScope,
378 }
379
380 impl ModuleOrUniformRoot<'_> {
381 fn same_def(lhs: Self, rhs: Self) -> bool {
382 match (lhs, rhs) {
383 (ModuleOrUniformRoot::Module(lhs),
384 ModuleOrUniformRoot::Module(rhs)) => lhs.def_id() == rhs.def_id(),
385 (ModuleOrUniformRoot::CrateRootAndExternPrelude,
386 ModuleOrUniformRoot::CrateRootAndExternPrelude) |
387 (ModuleOrUniformRoot::ExternPrelude, ModuleOrUniformRoot::ExternPrelude) |
388 (ModuleOrUniformRoot::CurrentScope, ModuleOrUniformRoot::CurrentScope) => true,
389 _ => false,
390 }
391 }
392 }
393
394 #[derive(Clone, Debug)]
395 enum PathResult<'a> {
396 Module(ModuleOrUniformRoot<'a>),
397 NonModule(PartialRes),
398 Indeterminate,
399 Failed {
400 span: Span,
401 label: String,
402 suggestion: Option<Suggestion>,
403 is_error_from_last_segment: bool,
404 },
405 }
406
407 enum ModuleKind {
408 /// An anonymous module; e.g., just a block.
409 ///
410 /// ```
411 /// fn main() {
412 /// fn f() {} // (1)
413 /// { // This is an anonymous module
414 /// f(); // This resolves to (2) as we are inside the block.
415 /// fn f() {} // (2)
416 /// }
417 /// f(); // Resolves to (1)
418 /// }
419 /// ```
420 Block(NodeId),
421 /// Any module with a name.
422 ///
423 /// This could be:
424 ///
425 /// * A normal module ‒ either `mod from_file;` or `mod from_block { }`.
426 /// * A trait or an enum (it implicitly contains associated types, methods and variant
427 /// constructors).
428 Def(DefKind, DefId, Name),
429 }
430
431 impl ModuleKind {
432 /// Get name of the module.
433 pub fn name(&self) -> Option<Name> {
434 match self {
435 ModuleKind::Block(..) => None,
436 ModuleKind::Def(.., name) => Some(*name),
437 }
438 }
439 }
440
441 /// A key that identifies a binding in a given `Module`.
442 ///
443 /// Multiple bindings in the same module can have the same key (in a valid
444 /// program) if all but one of them come from glob imports.
445 #[derive(Copy, Clone, PartialEq, Eq, Hash)]
446 struct BindingKey {
447 /// The identifier for the binding, aways the `modern` version of the
448 /// identifier.
449 ident: Ident,
450 ns: Namespace,
451 /// 0 if ident is not `_`, otherwise a value that's unique to the specific
452 /// `_` in the expanded AST that introduced this binding.
453 disambiguator: u32,
454 }
455
456 type Resolutions<'a> = RefCell<FxIndexMap<BindingKey, &'a RefCell<NameResolution<'a>>>>;
457
458 /// One node in the tree of modules.
459 pub struct ModuleData<'a> {
460 parent: Option<Module<'a>>,
461 kind: ModuleKind,
462
463 // The def id of the closest normal module (`mod`) ancestor (including this module).
464 normal_ancestor_id: DefId,
465
466 // Mapping between names and their (possibly in-progress) resolutions in this module.
467 // Resolutions in modules from other crates are not populated until accessed.
468 lazy_resolutions: Resolutions<'a>,
469 // True if this is a module from other crate that needs to be populated on access.
470 populate_on_access: Cell<bool>,
471
472 // Macro invocations that can expand into items in this module.
473 unexpanded_invocations: RefCell<FxHashSet<ExpnId>>,
474
475 no_implicit_prelude: bool,
476
477 glob_importers: RefCell<Vec<&'a ImportDirective<'a>>>,
478 globs: RefCell<Vec<&'a ImportDirective<'a>>>,
479
480 // Used to memoize the traits in this module for faster searches through all traits in scope.
481 traits: RefCell<Option<Box<[(Ident, &'a NameBinding<'a>)]>>>,
482
483 /// Span of the module itself. Used for error reporting.
484 span: Span,
485
486 expansion: ExpnId,
487 }
488
489 type Module<'a> = &'a ModuleData<'a>;
490
491 impl<'a> ModuleData<'a> {
492 fn new(parent: Option<Module<'a>>,
493 kind: ModuleKind,
494 normal_ancestor_id: DefId,
495 expansion: ExpnId,
496 span: Span) -> Self {
497 ModuleData {
498 parent,
499 kind,
500 normal_ancestor_id,
501 lazy_resolutions: Default::default(),
502 populate_on_access: Cell::new(!normal_ancestor_id.is_local()),
503 unexpanded_invocations: Default::default(),
504 no_implicit_prelude: false,
505 glob_importers: RefCell::new(Vec::new()),
506 globs: RefCell::new(Vec::new()),
507 traits: RefCell::new(None),
508 span,
509 expansion,
510 }
511 }
512
513 fn for_each_child<R, F>(&'a self, resolver: &mut R, mut f: F)
514 where R: AsMut<Resolver<'a>>, F: FnMut(&mut R, Ident, Namespace, &'a NameBinding<'a>)
515 {
516 for (key, name_resolution) in resolver.as_mut().resolutions(self).borrow().iter() {
517 name_resolution.borrow().binding.map(|binding| f(resolver, key.ident, key.ns, binding));
518 }
519 }
520
521 fn res(&self) -> Option<Res> {
522 match self.kind {
523 ModuleKind::Def(kind, def_id, _) => Some(Res::Def(kind, def_id)),
524 _ => None,
525 }
526 }
527
528 fn def_id(&self) -> Option<DefId> {
529 match self.kind {
530 ModuleKind::Def(_, def_id, _) => Some(def_id),
531 _ => None,
532 }
533 }
534
535 // `self` resolves to the first module ancestor that `is_normal`.
536 fn is_normal(&self) -> bool {
537 match self.kind {
538 ModuleKind::Def(DefKind::Mod, _, _) => true,
539 _ => false,
540 }
541 }
542
543 fn is_trait(&self) -> bool {
544 match self.kind {
545 ModuleKind::Def(DefKind::Trait, _, _) => true,
546 _ => false,
547 }
548 }
549
550 fn nearest_item_scope(&'a self) -> Module<'a> {
551 match self.kind {
552 ModuleKind::Def(DefKind::Enum, ..) | ModuleKind::Def(DefKind::Trait, ..) =>
553 self.parent.expect("enum or trait module without a parent"),
554 _ => self,
555 }
556 }
557
558 fn is_ancestor_of(&self, mut other: &Self) -> bool {
559 while !ptr::eq(self, other) {
560 if let Some(parent) = other.parent {
561 other = parent;
562 } else {
563 return false;
564 }
565 }
566 true
567 }
568 }
569
570 impl<'a> fmt::Debug for ModuleData<'a> {
571 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
572 write!(f, "{:?}", self.res())
573 }
574 }
575
576 /// Records a possibly-private value, type, or module definition.
577 #[derive(Clone, Debug)]
578 pub struct NameBinding<'a> {
579 kind: NameBindingKind<'a>,
580 ambiguity: Option<(&'a NameBinding<'a>, AmbiguityKind)>,
581 expansion: ExpnId,
582 span: Span,
583 vis: ty::Visibility,
584 }
585
586 pub trait ToNameBinding<'a> {
587 fn to_name_binding(self, arenas: &'a ResolverArenas<'a>) -> &'a NameBinding<'a>;
588 }
589
590 impl<'a> ToNameBinding<'a> for &'a NameBinding<'a> {
591 fn to_name_binding(self, _: &'a ResolverArenas<'a>) -> &'a NameBinding<'a> {
592 self
593 }
594 }
595
596 #[derive(Clone, Debug)]
597 enum NameBindingKind<'a> {
598 Res(Res, /* is_macro_export */ bool),
599 Module(Module<'a>),
600 Import {
601 binding: &'a NameBinding<'a>,
602 directive: &'a ImportDirective<'a>,
603 used: Cell<bool>,
604 },
605 }
606
607 impl<'a> NameBindingKind<'a> {
608 /// Is this a name binding of a import?
609 fn is_import(&self) -> bool {
610 match *self {
611 NameBindingKind::Import { .. } => true,
612 _ => false,
613 }
614 }
615 }
616
617 struct PrivacyError<'a>(Span, Ident, &'a NameBinding<'a>);
618
619 struct UseError<'a> {
620 err: DiagnosticBuilder<'a>,
621 /// Attach `use` statements for these candidates.
622 candidates: Vec<ImportSuggestion>,
623 /// The `NodeId` of the module to place the use-statements in.
624 node_id: NodeId,
625 /// Whether the diagnostic should state that it's "better".
626 better: bool,
627 }
628
629 #[derive(Clone, Copy, PartialEq, Debug)]
630 enum AmbiguityKind {
631 Import,
632 BuiltinAttr,
633 DeriveHelper,
634 LegacyHelperVsPrelude,
635 LegacyVsModern,
636 GlobVsOuter,
637 GlobVsGlob,
638 GlobVsExpanded,
639 MoreExpandedVsOuter,
640 }
641
642 impl AmbiguityKind {
643 fn descr(self) -> &'static str {
644 match self {
645 AmbiguityKind::Import =>
646 "name vs any other name during import resolution",
647 AmbiguityKind::BuiltinAttr =>
648 "built-in attribute vs any other name",
649 AmbiguityKind::DeriveHelper =>
650 "derive helper attribute vs any other name",
651 AmbiguityKind::LegacyHelperVsPrelude =>
652 "legacy plugin helper attribute vs name from prelude",
653 AmbiguityKind::LegacyVsModern =>
654 "`macro_rules` vs non-`macro_rules` from other module",
655 AmbiguityKind::GlobVsOuter =>
656 "glob import vs any other name from outer scope during import/macro resolution",
657 AmbiguityKind::GlobVsGlob =>
658 "glob import vs glob import in the same module",
659 AmbiguityKind::GlobVsExpanded =>
660 "glob import vs macro-expanded name in the same \
661 module during import/macro resolution",
662 AmbiguityKind::MoreExpandedVsOuter =>
663 "macro-expanded name vs less macro-expanded name \
664 from outer scope during import/macro resolution",
665 }
666 }
667 }
668
669 /// Miscellaneous bits of metadata for better ambiguity error reporting.
670 #[derive(Clone, Copy, PartialEq)]
671 enum AmbiguityErrorMisc {
672 SuggestCrate,
673 SuggestSelf,
674 FromPrelude,
675 None,
676 }
677
678 struct AmbiguityError<'a> {
679 kind: AmbiguityKind,
680 ident: Ident,
681 b1: &'a NameBinding<'a>,
682 b2: &'a NameBinding<'a>,
683 misc1: AmbiguityErrorMisc,
684 misc2: AmbiguityErrorMisc,
685 }
686
687 impl<'a> NameBinding<'a> {
688 fn module(&self) -> Option<Module<'a>> {
689 match self.kind {
690 NameBindingKind::Module(module) => Some(module),
691 NameBindingKind::Import { binding, .. } => binding.module(),
692 _ => None,
693 }
694 }
695
696 fn res(&self) -> Res {
697 match self.kind {
698 NameBindingKind::Res(res, _) => res,
699 NameBindingKind::Module(module) => module.res().unwrap(),
700 NameBindingKind::Import { binding, .. } => binding.res(),
701 }
702 }
703
704 fn is_ambiguity(&self) -> bool {
705 self.ambiguity.is_some() || match self.kind {
706 NameBindingKind::Import { binding, .. } => binding.is_ambiguity(),
707 _ => false,
708 }
709 }
710
711 // We sometimes need to treat variants as `pub` for backwards compatibility.
712 fn pseudo_vis(&self) -> ty::Visibility {
713 if self.is_variant() && self.res().def_id().is_local() {
714 ty::Visibility::Public
715 } else {
716 self.vis
717 }
718 }
719
720 fn is_variant(&self) -> bool {
721 match self.kind {
722 NameBindingKind::Res(Res::Def(DefKind::Variant, _), _) |
723 NameBindingKind::Res(Res::Def(DefKind::Ctor(CtorOf::Variant, ..), _), _) => true,
724 _ => false,
725 }
726 }
727
728 fn is_extern_crate(&self) -> bool {
729 match self.kind {
730 NameBindingKind::Import {
731 directive: &ImportDirective {
732 subclass: ImportDirectiveSubclass::ExternCrate { .. }, ..
733 }, ..
734 } => true,
735 NameBindingKind::Module(
736 &ModuleData { kind: ModuleKind::Def(DefKind::Mod, def_id, _), .. }
737 ) => def_id.index == CRATE_DEF_INDEX,
738 _ => false,
739 }
740 }
741
742 fn is_import(&self) -> bool {
743 match self.kind {
744 NameBindingKind::Import { .. } => true,
745 _ => false,
746 }
747 }
748
749 fn is_glob_import(&self) -> bool {
750 match self.kind {
751 NameBindingKind::Import { directive, .. } => directive.is_glob(),
752 _ => false,
753 }
754 }
755
756 fn is_importable(&self) -> bool {
757 match self.res() {
758 Res::Def(DefKind::AssocConst, _)
759 | Res::Def(DefKind::Method, _)
760 | Res::Def(DefKind::AssocTy, _) => false,
761 _ => true,
762 }
763 }
764
765 fn is_macro_def(&self) -> bool {
766 match self.kind {
767 NameBindingKind::Res(Res::Def(DefKind::Macro(..), _), _) => true,
768 _ => false,
769 }
770 }
771
772 fn macro_kind(&self) -> Option<MacroKind> {
773 self.res().macro_kind()
774 }
775
776 // Suppose that we resolved macro invocation with `invoc_parent_expansion` to binding `binding`
777 // at some expansion round `max(invoc, binding)` when they both emerged from macros.
778 // Then this function returns `true` if `self` may emerge from a macro *after* that
779 // in some later round and screw up our previously found resolution.
780 // See more detailed explanation in
781 // https://github.com/rust-lang/rust/pull/53778#issuecomment-419224049
782 fn may_appear_after(&self, invoc_parent_expansion: ExpnId, binding: &NameBinding<'_>) -> bool {
783 // self > max(invoc, binding) => !(self <= invoc || self <= binding)
784 // Expansions are partially ordered, so "may appear after" is an inversion of
785 // "certainly appears before or simultaneously" and includes unordered cases.
786 let self_parent_expansion = self.expansion;
787 let other_parent_expansion = binding.expansion;
788 let certainly_before_other_or_simultaneously =
789 other_parent_expansion.is_descendant_of(self_parent_expansion);
790 let certainly_before_invoc_or_simultaneously =
791 invoc_parent_expansion.is_descendant_of(self_parent_expansion);
792 !(certainly_before_other_or_simultaneously || certainly_before_invoc_or_simultaneously)
793 }
794 }
795
796 /// Interns the names of the primitive types.
797 ///
798 /// All other types are defined somewhere and possibly imported, but the primitive ones need
799 /// special handling, since they have no place of origin.
800 struct PrimitiveTypeTable {
801 primitive_types: FxHashMap<Name, PrimTy>,
802 }
803
804 impl PrimitiveTypeTable {
805 fn new() -> PrimitiveTypeTable {
806 let mut table = FxHashMap::default();
807
808 table.insert(sym::bool, Bool);
809 table.insert(sym::char, Char);
810 table.insert(sym::f32, Float(FloatTy::F32));
811 table.insert(sym::f64, Float(FloatTy::F64));
812 table.insert(sym::isize, Int(IntTy::Isize));
813 table.insert(sym::i8, Int(IntTy::I8));
814 table.insert(sym::i16, Int(IntTy::I16));
815 table.insert(sym::i32, Int(IntTy::I32));
816 table.insert(sym::i64, Int(IntTy::I64));
817 table.insert(sym::i128, Int(IntTy::I128));
818 table.insert(sym::str, Str);
819 table.insert(sym::usize, Uint(UintTy::Usize));
820 table.insert(sym::u8, Uint(UintTy::U8));
821 table.insert(sym::u16, Uint(UintTy::U16));
822 table.insert(sym::u32, Uint(UintTy::U32));
823 table.insert(sym::u64, Uint(UintTy::U64));
824 table.insert(sym::u128, Uint(UintTy::U128));
825 Self { primitive_types: table }
826 }
827 }
828
829 #[derive(Debug, Default, Clone)]
830 pub struct ExternPreludeEntry<'a> {
831 extern_crate_item: Option<&'a NameBinding<'a>>,
832 pub introduced_by_item: bool,
833 }
834
835 /// The main resolver class.
836 ///
837 /// This is the visitor that walks the whole crate.
838 pub struct Resolver<'a> {
839 session: &'a Session,
840
841 definitions: Definitions,
842
843 graph_root: Module<'a>,
844
845 prelude: Option<Module<'a>>,
846 extern_prelude: FxHashMap<Ident, ExternPreludeEntry<'a>>,
847
848 /// N.B., this is used only for better diagnostics, not name resolution itself.
849 has_self: FxHashSet<DefId>,
850
851 /// Names of fields of an item `DefId` accessible with dot syntax.
852 /// Used for hints during error reporting.
853 field_names: FxHashMap<DefId, Vec<Spanned<Name>>>,
854
855 /// All imports known to succeed or fail.
856 determined_imports: Vec<&'a ImportDirective<'a>>,
857
858 /// All non-determined imports.
859 indeterminate_imports: Vec<&'a ImportDirective<'a>>,
860
861 /// FIXME: Refactor things so that these fields are passed through arguments and not resolver.
862 /// We are resolving a last import segment during import validation.
863 last_import_segment: bool,
864 /// This binding should be ignored during in-module resolution, so that we don't get
865 /// "self-confirming" import resolutions during import validation.
866 blacklisted_binding: Option<&'a NameBinding<'a>>,
867
868 /// The idents for the primitive types.
869 primitive_type_table: PrimitiveTypeTable,
870
871 /// Resolutions for nodes that have a single resolution.
872 partial_res_map: NodeMap<PartialRes>,
873 /// Resolutions for import nodes, which have multiple resolutions in different namespaces.
874 import_res_map: NodeMap<PerNS<Option<Res>>>,
875 /// Resolutions for labels (node IDs of their corresponding blocks or loops).
876 label_res_map: NodeMap<NodeId>,
877
878 /// `CrateNum` resolutions of `extern crate` items.
879 extern_crate_map: NodeMap<CrateNum>,
880 export_map: ExportMap<NodeId>,
881 trait_map: TraitMap,
882
883 /// A map from nodes to anonymous modules.
884 /// Anonymous modules are pseudo-modules that are implicitly created around items
885 /// contained within blocks.
886 ///
887 /// For example, if we have this:
888 ///
889 /// fn f() {
890 /// fn g() {
891 /// ...
892 /// }
893 /// }
894 ///
895 /// There will be an anonymous module created around `g` with the ID of the
896 /// entry block for `f`.
897 block_map: NodeMap<Module<'a>>,
898 /// A fake module that contains no definition and no prelude. Used so that
899 /// some AST passes can generate identifiers that only resolve to local or
900 /// language items.
901 empty_module: Module<'a>,
902 module_map: FxHashMap<DefId, Module<'a>>,
903 extern_module_map: FxHashMap<DefId, Module<'a>>,
904 binding_parent_modules: FxHashMap<PtrKey<'a, NameBinding<'a>>, Module<'a>>,
905 underscore_disambiguator: u32,
906
907 /// Maps glob imports to the names of items actually imported.
908 glob_map: GlobMap,
909
910 used_imports: FxHashSet<(NodeId, Namespace)>,
911 maybe_unused_trait_imports: NodeSet,
912 maybe_unused_extern_crates: Vec<(NodeId, Span)>,
913
914 /// Privacy errors are delayed until the end in order to deduplicate them.
915 privacy_errors: Vec<PrivacyError<'a>>,
916 /// Ambiguity errors are delayed for deduplication.
917 ambiguity_errors: Vec<AmbiguityError<'a>>,
918 /// `use` injections are delayed for better placement and deduplication.
919 use_injections: Vec<UseError<'a>>,
920 /// Crate-local macro expanded `macro_export` referred to by a module-relative path.
921 macro_expanded_macro_export_errors: BTreeSet<(Span, Span)>,
922
923 arenas: &'a ResolverArenas<'a>,
924 dummy_binding: &'a NameBinding<'a>,
925
926 crate_loader: CrateLoader<'a>,
927 macro_names: FxHashSet<Ident>,
928 builtin_macros: FxHashMap<Name, SyntaxExtension>,
929 macro_use_prelude: FxHashMap<Name, &'a NameBinding<'a>>,
930 all_macros: FxHashMap<Name, Res>,
931 macro_map: FxHashMap<DefId, Lrc<SyntaxExtension>>,
932 dummy_ext_bang: Lrc<SyntaxExtension>,
933 dummy_ext_derive: Lrc<SyntaxExtension>,
934 non_macro_attrs: [Lrc<SyntaxExtension>; 2],
935 macro_defs: FxHashMap<ExpnId, DefId>,
936 local_macro_def_scopes: FxHashMap<NodeId, Module<'a>>,
937 ast_transform_scopes: FxHashMap<ExpnId, Module<'a>>,
938 unused_macros: NodeMap<Span>,
939 proc_macro_stubs: NodeSet,
940 /// Traces collected during macro resolution and validated when it's complete.
941 single_segment_macro_resolutions: Vec<(Ident, MacroKind, ParentScope<'a>,
942 Option<&'a NameBinding<'a>>)>,
943 multi_segment_macro_resolutions: Vec<(Vec<Segment>, Span, MacroKind, ParentScope<'a>,
944 Option<Res>)>,
945 builtin_attrs: Vec<(Ident, ParentScope<'a>)>,
946 /// Some built-in derives mark items they are applied to so they are treated specially later.
947 /// Derive macros cannot modify the item themselves and have to store the markers in the global
948 /// context, so they attach the markers to derive container IDs using this resolver table.
949 /// FIXME: Find a way for `PartialEq` and `Eq` to emulate `#[structural_match]`
950 /// by marking the produced impls rather than the original items.
951 special_derives: FxHashMap<ExpnId, SpecialDerives>,
952 /// Parent scopes in which the macros were invoked.
953 /// FIXME: `derives` are missing in these parent scopes and need to be taken from elsewhere.
954 invocation_parent_scopes: FxHashMap<ExpnId, ParentScope<'a>>,
955 /// Legacy scopes *produced* by expanding the macro invocations,
956 /// include all the `macro_rules` items and other invocations generated by them.
957 output_legacy_scopes: FxHashMap<ExpnId, LegacyScope<'a>>,
958
959 /// Avoid duplicated errors for "name already defined".
960 name_already_seen: FxHashMap<Name, Span>,
961
962 potentially_unused_imports: Vec<&'a ImportDirective<'a>>,
963
964 /// Table for mapping struct IDs into struct constructor IDs,
965 /// it's not used during normal resolution, only for better error reporting.
966 struct_constructors: DefIdMap<(Res, ty::Visibility)>,
967
968 /// Features enabled for this crate.
969 active_features: FxHashSet<Name>,
970
971 /// Stores enum visibilities to properly build a reduced graph
972 /// when visiting the correspondent variants.
973 variant_vis: DefIdMap<ty::Visibility>,
974
975 lint_buffer: lint::LintBuffer,
976 }
977
978 /// Nothing really interesting here; it just provides memory for the rest of the crate.
979 #[derive(Default)]
980 pub struct ResolverArenas<'a> {
981 modules: arena::TypedArena<ModuleData<'a>>,
982 local_modules: RefCell<Vec<Module<'a>>>,
983 name_bindings: arena::TypedArena<NameBinding<'a>>,
984 import_directives: arena::TypedArena<ImportDirective<'a>>,
985 name_resolutions: arena::TypedArena<RefCell<NameResolution<'a>>>,
986 legacy_bindings: arena::TypedArena<LegacyBinding<'a>>,
987 ast_paths: arena::TypedArena<ast::Path>,
988 }
989
990 impl<'a> ResolverArenas<'a> {
991 fn alloc_module(&'a self, module: ModuleData<'a>) -> Module<'a> {
992 let module = self.modules.alloc(module);
993 if module.def_id().map(|def_id| def_id.is_local()).unwrap_or(true) {
994 self.local_modules.borrow_mut().push(module);
995 }
996 module
997 }
998 fn local_modules(&'a self) -> std::cell::Ref<'a, Vec<Module<'a>>> {
999 self.local_modules.borrow()
1000 }
1001 fn alloc_name_binding(&'a self, name_binding: NameBinding<'a>) -> &'a NameBinding<'a> {
1002 self.name_bindings.alloc(name_binding)
1003 }
1004 fn alloc_import_directive(&'a self, import_directive: ImportDirective<'a>)
1005 -> &'a ImportDirective<'_> {
1006 self.import_directives.alloc(import_directive)
1007 }
1008 fn alloc_name_resolution(&'a self) -> &'a RefCell<NameResolution<'a>> {
1009 self.name_resolutions.alloc(Default::default())
1010 }
1011 fn alloc_legacy_binding(&'a self, binding: LegacyBinding<'a>) -> &'a LegacyBinding<'a> {
1012 self.legacy_bindings.alloc(binding)
1013 }
1014 fn alloc_ast_paths(&'a self, paths: &[ast::Path]) -> &'a [ast::Path] {
1015 self.ast_paths.alloc_from_iter(paths.iter().cloned())
1016 }
1017 }
1018
1019 impl<'a> AsMut<Resolver<'a>> for Resolver<'a> {
1020 fn as_mut(&mut self) -> &mut Resolver<'a> { self }
1021 }
1022
1023 impl<'a, 'b> DefIdTree for &'a Resolver<'b> {
1024 fn parent(self, id: DefId) -> Option<DefId> {
1025 match id.krate {
1026 LOCAL_CRATE => self.definitions.def_key(id.index).parent,
1027 _ => self.cstore().def_key(id).parent,
1028 }.map(|index| DefId { index, ..id })
1029 }
1030 }
1031
1032 /// This interface is used through the AST→HIR step, to embed full paths into the HIR. After that
1033 /// the resolver is no longer needed as all the relevant information is inline.
1034 impl<'a> hir::lowering::Resolver for Resolver<'a> {
1035 fn cstore(&self) -> &dyn CrateStore {
1036 self.cstore()
1037 }
1038
1039 fn resolve_str_path(
1040 &mut self,
1041 span: Span,
1042 crate_root: Option<Name>,
1043 components: &[Name],
1044 ns: Namespace,
1045 ) -> (ast::Path, Res) {
1046 let root = if crate_root.is_some() {
1047 kw::PathRoot
1048 } else {
1049 kw::Crate
1050 };
1051 let segments = iter::once(Ident::with_dummy_span(root))
1052 .chain(
1053 crate_root.into_iter()
1054 .chain(components.iter().cloned())
1055 .map(Ident::with_dummy_span)
1056 ).map(|i| self.new_ast_path_segment(i)).collect::<Vec<_>>();
1057
1058 let path = ast::Path {
1059 span,
1060 segments,
1061 };
1062
1063 let parent_scope = &ParentScope::module(self.graph_root);
1064 let res = match self.resolve_ast_path(&path, ns, parent_scope) {
1065 Ok(res) => res,
1066 Err((span, error)) => {
1067 self.report_error(span, error);
1068 Res::Err
1069 }
1070 };
1071 (path, res)
1072 }
1073
1074 fn get_partial_res(&mut self, id: NodeId) -> Option<PartialRes> {
1075 self.partial_res_map.get(&id).cloned()
1076 }
1077
1078 fn get_import_res(&mut self, id: NodeId) -> PerNS<Option<Res>> {
1079 self.import_res_map.get(&id).cloned().unwrap_or_default()
1080 }
1081
1082 fn get_label_res(&mut self, id: NodeId) -> Option<NodeId> {
1083 self.label_res_map.get(&id).cloned()
1084 }
1085
1086 fn definitions(&mut self) -> &mut Definitions {
1087 &mut self.definitions
1088 }
1089
1090 fn has_derives(&self, node_id: NodeId, derives: SpecialDerives) -> bool {
1091 let def_id = self.definitions.local_def_id(node_id);
1092 let expn_id = self.definitions.expansion_that_defined(def_id.index);
1093 self.has_derives(expn_id, derives)
1094 }
1095
1096 fn lint_buffer(&mut self) -> &mut lint::LintBuffer {
1097 &mut self.lint_buffer
1098 }
1099 }
1100
1101 impl<'a> Resolver<'a> {
1102 pub fn new(session: &'a Session,
1103 krate: &Crate,
1104 crate_name: &str,
1105 metadata_loader: &'a MetadataLoaderDyn,
1106 arenas: &'a ResolverArenas<'a>)
1107 -> Resolver<'a> {
1108 let root_def_id = DefId::local(CRATE_DEF_INDEX);
1109 let root_module_kind = ModuleKind::Def(
1110 DefKind::Mod,
1111 root_def_id,
1112 kw::Invalid,
1113 );
1114 let graph_root = arenas.alloc_module(ModuleData {
1115 no_implicit_prelude: attr::contains_name(&krate.attrs, sym::no_implicit_prelude),
1116 ..ModuleData::new(None, root_module_kind, root_def_id, ExpnId::root(), krate.span)
1117 });
1118 let empty_module_kind = ModuleKind::Def(
1119 DefKind::Mod,
1120 root_def_id,
1121 kw::Invalid,
1122 );
1123 let empty_module = arenas.alloc_module(ModuleData {
1124 no_implicit_prelude: true,
1125 ..ModuleData::new(
1126 Some(graph_root),
1127 empty_module_kind,
1128 root_def_id,
1129 ExpnId::root(),
1130 DUMMY_SP,
1131 )
1132 });
1133 let mut module_map = FxHashMap::default();
1134 module_map.insert(DefId::local(CRATE_DEF_INDEX), graph_root);
1135
1136 let mut definitions = Definitions::default();
1137 definitions.create_root_def(crate_name, session.local_crate_disambiguator());
1138
1139 let mut extern_prelude: FxHashMap<Ident, ExternPreludeEntry<'_>> =
1140 session.opts.externs.iter().map(|kv| (Ident::from_str(kv.0), Default::default()))
1141 .collect();
1142
1143 if !attr::contains_name(&krate.attrs, sym::no_core) {
1144 extern_prelude.insert(Ident::with_dummy_span(sym::core), Default::default());
1145 if !attr::contains_name(&krate.attrs, sym::no_std) {
1146 extern_prelude.insert(Ident::with_dummy_span(sym::std), Default::default());
1147 if session.rust_2018() {
1148 extern_prelude.insert(Ident::with_dummy_span(sym::meta), Default::default());
1149 }
1150 }
1151 }
1152
1153 let mut invocation_parent_scopes = FxHashMap::default();
1154 invocation_parent_scopes.insert(ExpnId::root(), ParentScope::module(graph_root));
1155
1156 let mut macro_defs = FxHashMap::default();
1157 macro_defs.insert(ExpnId::root(), root_def_id);
1158
1159 let features = session.features_untracked();
1160 let non_macro_attr =
1161 |mark_used| Lrc::new(SyntaxExtension::non_macro_attr(mark_used, session.edition()));
1162
1163 Resolver {
1164 session,
1165
1166 definitions,
1167
1168 // The outermost module has def ID 0; this is not reflected in the
1169 // AST.
1170 graph_root,
1171 prelude: None,
1172 extern_prelude,
1173
1174 has_self: FxHashSet::default(),
1175 field_names: FxHashMap::default(),
1176
1177 determined_imports: Vec::new(),
1178 indeterminate_imports: Vec::new(),
1179
1180 last_import_segment: false,
1181 blacklisted_binding: None,
1182
1183 primitive_type_table: PrimitiveTypeTable::new(),
1184
1185 partial_res_map: Default::default(),
1186 import_res_map: Default::default(),
1187 label_res_map: Default::default(),
1188 extern_crate_map: Default::default(),
1189 export_map: FxHashMap::default(),
1190 trait_map: Default::default(),
1191 underscore_disambiguator: 0,
1192 empty_module,
1193 module_map,
1194 block_map: Default::default(),
1195 extern_module_map: FxHashMap::default(),
1196 binding_parent_modules: FxHashMap::default(),
1197 ast_transform_scopes: FxHashMap::default(),
1198
1199 glob_map: Default::default(),
1200
1201 used_imports: FxHashSet::default(),
1202 maybe_unused_trait_imports: Default::default(),
1203 maybe_unused_extern_crates: Vec::new(),
1204
1205 privacy_errors: Vec::new(),
1206 ambiguity_errors: Vec::new(),
1207 use_injections: Vec::new(),
1208 macro_expanded_macro_export_errors: BTreeSet::new(),
1209
1210 arenas,
1211 dummy_binding: arenas.alloc_name_binding(NameBinding {
1212 kind: NameBindingKind::Res(Res::Err, false),
1213 ambiguity: None,
1214 expansion: ExpnId::root(),
1215 span: DUMMY_SP,
1216 vis: ty::Visibility::Public,
1217 }),
1218
1219 crate_loader: CrateLoader::new(session, metadata_loader, crate_name),
1220 macro_names: FxHashSet::default(),
1221 builtin_macros: Default::default(),
1222 macro_use_prelude: FxHashMap::default(),
1223 all_macros: FxHashMap::default(),
1224 macro_map: FxHashMap::default(),
1225 dummy_ext_bang: Lrc::new(SyntaxExtension::dummy_bang(session.edition())),
1226 dummy_ext_derive: Lrc::new(SyntaxExtension::dummy_derive(session.edition())),
1227 non_macro_attrs: [non_macro_attr(false), non_macro_attr(true)],
1228 invocation_parent_scopes,
1229 output_legacy_scopes: Default::default(),
1230 macro_defs,
1231 local_macro_def_scopes: FxHashMap::default(),
1232 name_already_seen: FxHashMap::default(),
1233 potentially_unused_imports: Vec::new(),
1234 struct_constructors: Default::default(),
1235 unused_macros: Default::default(),
1236 proc_macro_stubs: Default::default(),
1237 single_segment_macro_resolutions: Default::default(),
1238 multi_segment_macro_resolutions: Default::default(),
1239 builtin_attrs: Default::default(),
1240 special_derives: Default::default(),
1241 active_features:
1242 features.declared_lib_features.iter().map(|(feat, ..)| *feat)
1243 .chain(features.declared_lang_features.iter().map(|(feat, ..)| *feat))
1244 .collect(),
1245 variant_vis: Default::default(),
1246 lint_buffer: lint::LintBuffer::default(),
1247 }
1248 }
1249
1250 pub fn lint_buffer(&mut self) -> &mut lint::LintBuffer {
1251 &mut self.lint_buffer
1252 }
1253
1254 pub fn arenas() -> ResolverArenas<'a> {
1255 Default::default()
1256 }
1257
1258 pub fn into_outputs(self) -> ResolverOutputs {
1259 ResolverOutputs {
1260 definitions: self.definitions,
1261 cstore: Box::new(self.crate_loader.into_cstore()),
1262 extern_crate_map: self.extern_crate_map,
1263 export_map: self.export_map,
1264 trait_map: self.trait_map,
1265 glob_map: self.glob_map,
1266 maybe_unused_trait_imports: self.maybe_unused_trait_imports,
1267 maybe_unused_extern_crates: self.maybe_unused_extern_crates,
1268 extern_prelude: self.extern_prelude.iter().map(|(ident, entry)| {
1269 (ident.name, entry.introduced_by_item)
1270 }).collect(),
1271 }
1272 }
1273
1274 pub fn clone_outputs(&self) -> ResolverOutputs {
1275 ResolverOutputs {
1276 definitions: self.definitions.clone(),
1277 cstore: Box::new(self.cstore().clone()),
1278 extern_crate_map: self.extern_crate_map.clone(),
1279 export_map: self.export_map.clone(),
1280 trait_map: self.trait_map.clone(),
1281 glob_map: self.glob_map.clone(),
1282 maybe_unused_trait_imports: self.maybe_unused_trait_imports.clone(),
1283 maybe_unused_extern_crates: self.maybe_unused_extern_crates.clone(),
1284 extern_prelude: self.extern_prelude.iter().map(|(ident, entry)| {
1285 (ident.name, entry.introduced_by_item)
1286 }).collect(),
1287 }
1288 }
1289
1290 pub fn cstore(&self) -> &CStore {
1291 self.crate_loader.cstore()
1292 }
1293
1294 fn non_macro_attr(&self, mark_used: bool) -> Lrc<SyntaxExtension> {
1295 self.non_macro_attrs[mark_used as usize].clone()
1296 }
1297
1298 fn dummy_ext(&self, macro_kind: MacroKind) -> Lrc<SyntaxExtension> {
1299 match macro_kind {
1300 MacroKind::Bang => self.dummy_ext_bang.clone(),
1301 MacroKind::Derive => self.dummy_ext_derive.clone(),
1302 MacroKind::Attr => self.non_macro_attr(true),
1303 }
1304 }
1305
1306 /// Runs the function on each namespace.
1307 fn per_ns<F: FnMut(&mut Self, Namespace)>(&mut self, mut f: F) {
1308 f(self, TypeNS);
1309 f(self, ValueNS);
1310 f(self, MacroNS);
1311 }
1312
1313 fn is_builtin_macro(&mut self, res: Res) -> bool {
1314 self.get_macro(res).map_or(false, |ext| ext.is_builtin)
1315 }
1316
1317 fn macro_def(&self, mut ctxt: SyntaxContext) -> DefId {
1318 loop {
1319 match self.macro_defs.get(&ctxt.outer_expn()) {
1320 Some(&def_id) => return def_id,
1321 None => ctxt.remove_mark(),
1322 };
1323 }
1324 }
1325
1326 fn has_derives(&self, expn_id: ExpnId, markers: SpecialDerives) -> bool {
1327 self.special_derives.get(&expn_id).map_or(false, |m| m.contains(markers))
1328 }
1329
1330 /// Entry point to crate resolution.
1331 pub fn resolve_crate(&mut self, krate: &Crate) {
1332 let _prof_timer =
1333 self.session.prof.generic_activity("resolve_crate");
1334
1335 ImportResolver { r: self }.finalize_imports();
1336 self.finalize_macro_resolutions();
1337
1338 self.late_resolve_crate(krate);
1339
1340 self.check_unused(krate);
1341 self.report_errors(krate);
1342 self.crate_loader.postprocess(krate);
1343 }
1344
1345 fn new_module(
1346 &self,
1347 parent: Module<'a>,
1348 kind: ModuleKind,
1349 normal_ancestor_id: DefId,
1350 expn_id: ExpnId,
1351 span: Span,
1352 ) -> Module<'a> {
1353 let module = ModuleData::new(Some(parent), kind, normal_ancestor_id, expn_id, span);
1354 self.arenas.alloc_module(module)
1355 }
1356
1357 fn new_key(&mut self, ident: Ident, ns: Namespace) -> BindingKey {
1358 let ident = ident.modern();
1359 let disambiguator = if ident.name == kw::Underscore {
1360 self.underscore_disambiguator += 1;
1361 self.underscore_disambiguator
1362 } else {
1363 0
1364 };
1365 BindingKey { ident, ns, disambiguator }
1366 }
1367
1368 fn resolutions(&mut self, module: Module<'a>) -> &'a Resolutions<'a> {
1369 if module.populate_on_access.get() {
1370 module.populate_on_access.set(false);
1371 self.build_reduced_graph_external(module);
1372 }
1373 &module.lazy_resolutions
1374 }
1375
1376 fn resolution(&mut self, module: Module<'a>, key: BindingKey)
1377 -> &'a RefCell<NameResolution<'a>> {
1378 *self.resolutions(module).borrow_mut().entry(key)
1379 .or_insert_with(|| self.arenas.alloc_name_resolution())
1380 }
1381
1382 fn record_use(&mut self, ident: Ident, ns: Namespace,
1383 used_binding: &'a NameBinding<'a>, is_lexical_scope: bool) {
1384 if let Some((b2, kind)) = used_binding.ambiguity {
1385 self.ambiguity_errors.push(AmbiguityError {
1386 kind, ident, b1: used_binding, b2,
1387 misc1: AmbiguityErrorMisc::None,
1388 misc2: AmbiguityErrorMisc::None,
1389 });
1390 }
1391 if let NameBindingKind::Import { directive, binding, ref used } = used_binding.kind {
1392 // Avoid marking `extern crate` items that refer to a name from extern prelude,
1393 // but not introduce it, as used if they are accessed from lexical scope.
1394 if is_lexical_scope {
1395 if let Some(entry) = self.extern_prelude.get(&ident.modern()) {
1396 if let Some(crate_item) = entry.extern_crate_item {
1397 if ptr::eq(used_binding, crate_item) && !entry.introduced_by_item {
1398 return;
1399 }
1400 }
1401 }
1402 }
1403 used.set(true);
1404 directive.used.set(true);
1405 self.used_imports.insert((directive.id, ns));
1406 self.add_to_glob_map(&directive, ident);
1407 self.record_use(ident, ns, binding, false);
1408 }
1409 }
1410
1411 #[inline]
1412 fn add_to_glob_map(&mut self, directive: &ImportDirective<'_>, ident: Ident) {
1413 if directive.is_glob() {
1414 self.glob_map.entry(directive.id).or_default().insert(ident.name);
1415 }
1416 }
1417
1418 /// A generic scope visitor.
1419 /// Visits scopes in order to resolve some identifier in them or perform other actions.
1420 /// If the callback returns `Some` result, we stop visiting scopes and return it.
1421 fn visit_scopes<T>(
1422 &mut self,
1423 scope_set: ScopeSet,
1424 parent_scope: &ParentScope<'a>,
1425 ident: Ident,
1426 mut visitor: impl FnMut(&mut Self, Scope<'a>, /*use_prelude*/ bool, Ident) -> Option<T>,
1427 ) -> Option<T> {
1428 // General principles:
1429 // 1. Not controlled (user-defined) names should have higher priority than controlled names
1430 // built into the language or standard library. This way we can add new names into the
1431 // language or standard library without breaking user code.
1432 // 2. "Closed set" below means new names cannot appear after the current resolution attempt.
1433 // Places to search (in order of decreasing priority):
1434 // (Type NS)
1435 // 1. FIXME: Ribs (type parameters), there's no necessary infrastructure yet
1436 // (open set, not controlled).
1437 // 2. Names in modules (both normal `mod`ules and blocks), loop through hygienic parents
1438 // (open, not controlled).
1439 // 3. Extern prelude (open, the open part is from macro expansions, not controlled).
1440 // 4. Tool modules (closed, controlled right now, but not in the future).
1441 // 5. Standard library prelude (de-facto closed, controlled).
1442 // 6. Language prelude (closed, controlled).
1443 // (Value NS)
1444 // 1. FIXME: Ribs (local variables), there's no necessary infrastructure yet
1445 // (open set, not controlled).
1446 // 2. Names in modules (both normal `mod`ules and blocks), loop through hygienic parents
1447 // (open, not controlled).
1448 // 3. Standard library prelude (de-facto closed, controlled).
1449 // (Macro NS)
1450 // 1-3. Derive helpers (open, not controlled). All ambiguities with other names
1451 // are currently reported as errors. They should be higher in priority than preludes
1452 // and probably even names in modules according to the "general principles" above. They
1453 // also should be subject to restricted shadowing because are effectively produced by
1454 // derives (you need to resolve the derive first to add helpers into scope), but they
1455 // should be available before the derive is expanded for compatibility.
1456 // It's mess in general, so we are being conservative for now.
1457 // 1-3. `macro_rules` (open, not controlled), loop through legacy scopes. Have higher
1458 // priority than prelude macros, but create ambiguities with macros in modules.
1459 // 1-3. Names in modules (both normal `mod`ules and blocks), loop through hygienic parents
1460 // (open, not controlled). Have higher priority than prelude macros, but create
1461 // ambiguities with `macro_rules`.
1462 // 4. `macro_use` prelude (open, the open part is from macro expansions, not controlled).
1463 // 4a. User-defined prelude from macro-use
1464 // (open, the open part is from macro expansions, not controlled).
1465 // 4b. "Standard library prelude" part implemented through `macro-use` (closed, controlled).
1466 // 4c. Standard library prelude (de-facto closed, controlled).
1467 // 6. Language prelude: builtin attributes (closed, controlled).
1468 // 4-6. Legacy plugin helpers (open, not controlled). Similar to derive helpers,
1469 // but introduced by legacy plugins using `register_attribute`. Priority is somewhere
1470 // in prelude, not sure where exactly (creates ambiguities with any other prelude names).
1471
1472 let rust_2015 = ident.span.rust_2015();
1473 let (ns, is_absolute_path) = match scope_set {
1474 ScopeSet::All(ns, _) => (ns, false),
1475 ScopeSet::AbsolutePath(ns) => (ns, true),
1476 ScopeSet::Macro(_) => (MacroNS, false),
1477 };
1478 // Jump out of trait or enum modules, they do not act as scopes.
1479 let module = parent_scope.module.nearest_item_scope();
1480 let mut scope = match ns {
1481 _ if is_absolute_path => Scope::CrateRoot,
1482 TypeNS | ValueNS => Scope::Module(module),
1483 MacroNS => Scope::DeriveHelpers,
1484 };
1485 let mut ident = ident.modern();
1486 let mut use_prelude = !module.no_implicit_prelude;
1487
1488 loop {
1489 let visit = match scope {
1490 Scope::DeriveHelpers => true,
1491 Scope::MacroRules(..) => true,
1492 Scope::CrateRoot => true,
1493 Scope::Module(..) => true,
1494 Scope::MacroUsePrelude => use_prelude || rust_2015,
1495 Scope::BuiltinAttrs => true,
1496 Scope::LegacyPluginHelpers => use_prelude || rust_2015,
1497 Scope::ExternPrelude => use_prelude || is_absolute_path,
1498 Scope::ToolPrelude => use_prelude,
1499 Scope::StdLibPrelude => use_prelude || ns == MacroNS,
1500 Scope::BuiltinTypes => true,
1501 };
1502
1503 if visit {
1504 if let break_result @ Some(..) = visitor(self, scope, use_prelude, ident) {
1505 return break_result;
1506 }
1507 }
1508
1509 scope = match scope {
1510 Scope::DeriveHelpers =>
1511 Scope::MacroRules(parent_scope.legacy),
1512 Scope::MacroRules(legacy_scope) => match legacy_scope {
1513 LegacyScope::Binding(binding) => Scope::MacroRules(
1514 binding.parent_legacy_scope
1515 ),
1516 LegacyScope::Invocation(invoc_id) => Scope::MacroRules(
1517 self.output_legacy_scopes.get(&invoc_id).cloned()
1518 .unwrap_or(self.invocation_parent_scopes[&invoc_id].legacy)
1519 ),
1520 LegacyScope::Empty => Scope::Module(module),
1521 }
1522 Scope::CrateRoot => match ns {
1523 TypeNS => {
1524 ident.span.adjust(ExpnId::root());
1525 Scope::ExternPrelude
1526 }
1527 ValueNS | MacroNS => break,
1528 }
1529 Scope::Module(module) => {
1530 use_prelude = !module.no_implicit_prelude;
1531 match self.hygienic_lexical_parent(module, &mut ident.span) {
1532 Some(parent_module) => Scope::Module(parent_module),
1533 None => {
1534 ident.span.adjust(ExpnId::root());
1535 match ns {
1536 TypeNS => Scope::ExternPrelude,
1537 ValueNS => Scope::StdLibPrelude,
1538 MacroNS => Scope::MacroUsePrelude,
1539 }
1540 }
1541 }
1542 }
1543 Scope::MacroUsePrelude => Scope::StdLibPrelude,
1544 Scope::BuiltinAttrs => Scope::LegacyPluginHelpers,
1545 Scope::LegacyPluginHelpers => break, // nowhere else to search
1546 Scope::ExternPrelude if is_absolute_path => break,
1547 Scope::ExternPrelude => Scope::ToolPrelude,
1548 Scope::ToolPrelude => Scope::StdLibPrelude,
1549 Scope::StdLibPrelude => match ns {
1550 TypeNS => Scope::BuiltinTypes,
1551 ValueNS => break, // nowhere else to search
1552 MacroNS => Scope::BuiltinAttrs,
1553 }
1554 Scope::BuiltinTypes => break, // nowhere else to search
1555 };
1556 }
1557
1558 None
1559 }
1560
1561 /// This resolves the identifier `ident` in the namespace `ns` in the current lexical scope.
1562 /// More specifically, we proceed up the hierarchy of scopes and return the binding for
1563 /// `ident` in the first scope that defines it (or None if no scopes define it).
1564 ///
1565 /// A block's items are above its local variables in the scope hierarchy, regardless of where
1566 /// the items are defined in the block. For example,
1567 /// ```rust
1568 /// fn f() {
1569 /// g(); // Since there are no local variables in scope yet, this resolves to the item.
1570 /// let g = || {};
1571 /// fn g() {}
1572 /// g(); // This resolves to the local variable `g` since it shadows the item.
1573 /// }
1574 /// ```
1575 ///
1576 /// Invariant: This must only be called during main resolution, not during
1577 /// import resolution.
1578 fn resolve_ident_in_lexical_scope(&mut self,
1579 mut ident: Ident,
1580 ns: Namespace,
1581 parent_scope: &ParentScope<'a>,
1582 record_used_id: Option<NodeId>,
1583 path_span: Span,
1584 ribs: &[Rib<'a>])
1585 -> Option<LexicalScopeBinding<'a>> {
1586 assert!(ns == TypeNS || ns == ValueNS);
1587 if ident.name == kw::Invalid {
1588 return Some(LexicalScopeBinding::Res(Res::Err));
1589 }
1590 let (general_span, modern_span) = if ident.name == kw::SelfUpper {
1591 // FIXME(jseyfried) improve `Self` hygiene
1592 let empty_span = ident.span.with_ctxt(SyntaxContext::root());
1593 (empty_span, empty_span)
1594 } else if ns == TypeNS {
1595 let modern_span = ident.span.modern();
1596 (modern_span, modern_span)
1597 } else {
1598 (ident.span.modern_and_legacy(), ident.span.modern())
1599 };
1600 ident.span = general_span;
1601 let modern_ident = Ident { span: modern_span, ..ident };
1602
1603 // Walk backwards up the ribs in scope.
1604 let record_used = record_used_id.is_some();
1605 let mut module = self.graph_root;
1606 for i in (0 .. ribs.len()).rev() {
1607 debug!("walk rib\n{:?}", ribs[i].bindings);
1608 // Use the rib kind to determine whether we are resolving parameters
1609 // (modern hygiene) or local variables (legacy hygiene).
1610 let rib_ident = if ribs[i].kind.contains_params() {
1611 modern_ident
1612 } else {
1613 ident
1614 };
1615 if let Some(res) = ribs[i].bindings.get(&rib_ident).cloned() {
1616 // The ident resolves to a type parameter or local variable.
1617 return Some(LexicalScopeBinding::Res(
1618 self.validate_res_from_ribs(i, rib_ident, res, record_used, path_span, ribs),
1619 ));
1620 }
1621
1622 module = match ribs[i].kind {
1623 ModuleRibKind(module) => module,
1624 MacroDefinition(def) if def == self.macro_def(ident.span.ctxt()) => {
1625 // If an invocation of this macro created `ident`, give up on `ident`
1626 // and switch to `ident`'s source from the macro definition.
1627 ident.span.remove_mark();
1628 continue
1629 }
1630 _ => continue,
1631 };
1632
1633
1634 let item = self.resolve_ident_in_module_unadjusted(
1635 ModuleOrUniformRoot::Module(module),
1636 ident,
1637 ns,
1638 parent_scope,
1639 record_used,
1640 path_span,
1641 );
1642 if let Ok(binding) = item {
1643 // The ident resolves to an item.
1644 return Some(LexicalScopeBinding::Item(binding));
1645 }
1646
1647 match module.kind {
1648 ModuleKind::Block(..) => {}, // We can see through blocks
1649 _ => break,
1650 }
1651 }
1652
1653 ident = modern_ident;
1654 let mut poisoned = None;
1655 loop {
1656 let opt_module = if let Some(node_id) = record_used_id {
1657 self.hygienic_lexical_parent_with_compatibility_fallback(module, &mut ident.span,
1658 node_id, &mut poisoned)
1659 } else {
1660 self.hygienic_lexical_parent(module, &mut ident.span)
1661 };
1662 module = unwrap_or!(opt_module, break);
1663 let adjusted_parent_scope = &ParentScope { module, ..*parent_scope };
1664 let result = self.resolve_ident_in_module_unadjusted(
1665 ModuleOrUniformRoot::Module(module),
1666 ident,
1667 ns,
1668 adjusted_parent_scope,
1669 record_used,
1670 path_span,
1671 );
1672
1673 match result {
1674 Ok(binding) => {
1675 if let Some(node_id) = poisoned {
1676 self.lint_buffer.buffer_lint_with_diagnostic(
1677 lint::builtin::PROC_MACRO_DERIVE_RESOLUTION_FALLBACK,
1678 node_id, ident.span,
1679 &format!("cannot find {} `{}` in this scope", ns.descr(), ident),
1680 lint::builtin::BuiltinLintDiagnostics::
1681 ProcMacroDeriveResolutionFallback(ident.span),
1682 );
1683 }
1684 return Some(LexicalScopeBinding::Item(binding))
1685 }
1686 Err(Determined) => continue,
1687 Err(Undetermined) =>
1688 span_bug!(ident.span, "undetermined resolution during main resolution pass"),
1689 }
1690 }
1691
1692 if !module.no_implicit_prelude {
1693 ident.span.adjust(ExpnId::root());
1694 if ns == TypeNS {
1695 if let Some(binding) = self.extern_prelude_get(ident, !record_used) {
1696 return Some(LexicalScopeBinding::Item(binding));
1697 }
1698 }
1699 if ns == TypeNS && KNOWN_TOOLS.contains(&ident.name) {
1700 let binding = (Res::ToolMod, ty::Visibility::Public,
1701 DUMMY_SP, ExpnId::root()).to_name_binding(self.arenas);
1702 return Some(LexicalScopeBinding::Item(binding));
1703 }
1704 if let Some(prelude) = self.prelude {
1705 if let Ok(binding) = self.resolve_ident_in_module_unadjusted(
1706 ModuleOrUniformRoot::Module(prelude),
1707 ident,
1708 ns,
1709 parent_scope,
1710 false,
1711 path_span,
1712 ) {
1713 return Some(LexicalScopeBinding::Item(binding));
1714 }
1715 }
1716 }
1717
1718 None
1719 }
1720
1721 fn hygienic_lexical_parent(&mut self, module: Module<'a>, span: &mut Span)
1722 -> Option<Module<'a>> {
1723 if !module.expansion.outer_expn_is_descendant_of(span.ctxt()) {
1724 return Some(self.macro_def_scope(span.remove_mark()));
1725 }
1726
1727 if let ModuleKind::Block(..) = module.kind {
1728 return Some(module.parent.unwrap().nearest_item_scope());
1729 }
1730
1731 None
1732 }
1733
1734 fn hygienic_lexical_parent_with_compatibility_fallback(&mut self, module: Module<'a>,
1735 span: &mut Span, node_id: NodeId,
1736 poisoned: &mut Option<NodeId>)
1737 -> Option<Module<'a>> {
1738 if let module @ Some(..) = self.hygienic_lexical_parent(module, span) {
1739 return module;
1740 }
1741
1742 // We need to support the next case under a deprecation warning
1743 // ```
1744 // struct MyStruct;
1745 // ---- begin: this comes from a proc macro derive
1746 // mod implementation_details {
1747 // // Note that `MyStruct` is not in scope here.
1748 // impl SomeTrait for MyStruct { ... }
1749 // }
1750 // ---- end
1751 // ```
1752 // So we have to fall back to the module's parent during lexical resolution in this case.
1753 if let Some(parent) = module.parent {
1754 // Inner module is inside the macro, parent module is outside of the macro.
1755 if module.expansion != parent.expansion &&
1756 module.expansion.is_descendant_of(parent.expansion) {
1757 // The macro is a proc macro derive
1758 if let Some(&def_id) = self.macro_defs.get(&module.expansion) {
1759 if let Some(ext) = self.get_macro_by_def_id(def_id) {
1760 if !ext.is_builtin && ext.macro_kind() == MacroKind::Derive {
1761 if parent.expansion.outer_expn_is_descendant_of(span.ctxt()) {
1762 *poisoned = Some(node_id);
1763 return module.parent;
1764 }
1765 }
1766 }
1767 }
1768 }
1769 }
1770
1771 None
1772 }
1773
1774 fn resolve_ident_in_module(
1775 &mut self,
1776 module: ModuleOrUniformRoot<'a>,
1777 ident: Ident,
1778 ns: Namespace,
1779 parent_scope: &ParentScope<'a>,
1780 record_used: bool,
1781 path_span: Span
1782 ) -> Result<&'a NameBinding<'a>, Determinacy> {
1783 self.resolve_ident_in_module_ext(
1784 module, ident, ns, parent_scope, record_used, path_span
1785 ).map_err(|(determinacy, _)| determinacy)
1786 }
1787
1788 fn resolve_ident_in_module_ext(
1789 &mut self,
1790 module: ModuleOrUniformRoot<'a>,
1791 mut ident: Ident,
1792 ns: Namespace,
1793 parent_scope: &ParentScope<'a>,
1794 record_used: bool,
1795 path_span: Span
1796 ) -> Result<&'a NameBinding<'a>, (Determinacy, Weak)> {
1797 let tmp_parent_scope;
1798 let mut adjusted_parent_scope = parent_scope;
1799 match module {
1800 ModuleOrUniformRoot::Module(m) => {
1801 if let Some(def) = ident.span.modernize_and_adjust(m.expansion) {
1802 tmp_parent_scope =
1803 ParentScope { module: self.macro_def_scope(def), ..*parent_scope };
1804 adjusted_parent_scope = &tmp_parent_scope;
1805 }
1806 }
1807 ModuleOrUniformRoot::ExternPrelude => {
1808 ident.span.modernize_and_adjust(ExpnId::root());
1809 }
1810 ModuleOrUniformRoot::CrateRootAndExternPrelude |
1811 ModuleOrUniformRoot::CurrentScope => {
1812 // No adjustments
1813 }
1814 }
1815 let result = self.resolve_ident_in_module_unadjusted_ext(
1816 module, ident, ns, adjusted_parent_scope, false, record_used, path_span,
1817 );
1818 result
1819 }
1820
1821 fn resolve_crate_root(&mut self, ident: Ident) -> Module<'a> {
1822 let mut ctxt = ident.span.ctxt();
1823 let mark = if ident.name == kw::DollarCrate {
1824 // When resolving `$crate` from a `macro_rules!` invoked in a `macro`,
1825 // we don't want to pretend that the `macro_rules!` definition is in the `macro`
1826 // as described in `SyntaxContext::apply_mark`, so we ignore prepended modern marks.
1827 // FIXME: This is only a guess and it doesn't work correctly for `macro_rules!`
1828 // definitions actually produced by `macro` and `macro` definitions produced by
1829 // `macro_rules!`, but at least such configurations are not stable yet.
1830 ctxt = ctxt.modern_and_legacy();
1831 let mut iter = ctxt.marks().into_iter().rev().peekable();
1832 let mut result = None;
1833 // Find the last modern mark from the end if it exists.
1834 while let Some(&(mark, transparency)) = iter.peek() {
1835 if transparency == Transparency::Opaque {
1836 result = Some(mark);
1837 iter.next();
1838 } else {
1839 break;
1840 }
1841 }
1842 // Then find the last legacy mark from the end if it exists.
1843 for (mark, transparency) in iter {
1844 if transparency == Transparency::SemiTransparent {
1845 result = Some(mark);
1846 } else {
1847 break;
1848 }
1849 }
1850 result
1851 } else {
1852 ctxt = ctxt.modern();
1853 ctxt.adjust(ExpnId::root())
1854 };
1855 let module = match mark {
1856 Some(def) => self.macro_def_scope(def),
1857 None => return self.graph_root,
1858 };
1859 self.get_module(DefId { index: CRATE_DEF_INDEX, ..module.normal_ancestor_id })
1860 }
1861
1862 fn resolve_self(&mut self, ctxt: &mut SyntaxContext, module: Module<'a>) -> Module<'a> {
1863 let mut module = self.get_module(module.normal_ancestor_id);
1864 while module.span.ctxt().modern() != *ctxt {
1865 let parent = module.parent.unwrap_or_else(|| self.macro_def_scope(ctxt.remove_mark()));
1866 module = self.get_module(parent.normal_ancestor_id);
1867 }
1868 module
1869 }
1870
1871 fn resolve_path(
1872 &mut self,
1873 path: &[Segment],
1874 opt_ns: Option<Namespace>, // `None` indicates a module path in import
1875 parent_scope: &ParentScope<'a>,
1876 record_used: bool,
1877 path_span: Span,
1878 crate_lint: CrateLint,
1879 ) -> PathResult<'a> {
1880 self.resolve_path_with_ribs(
1881 path, opt_ns, parent_scope, record_used, path_span, crate_lint, None
1882 )
1883 }
1884
1885 fn resolve_path_with_ribs(
1886 &mut self,
1887 path: &[Segment],
1888 opt_ns: Option<Namespace>, // `None` indicates a module path in import
1889 parent_scope: &ParentScope<'a>,
1890 record_used: bool,
1891 path_span: Span,
1892 crate_lint: CrateLint,
1893 ribs: Option<&PerNS<Vec<Rib<'a>>>>,
1894 ) -> PathResult<'a> {
1895 let mut module = None;
1896 let mut allow_super = true;
1897 let mut second_binding = None;
1898
1899 debug!(
1900 "resolve_path(path={:?}, opt_ns={:?}, record_used={:?}, \
1901 path_span={:?}, crate_lint={:?})",
1902 path,
1903 opt_ns,
1904 record_used,
1905 path_span,
1906 crate_lint,
1907 );
1908
1909 for (i, &Segment { ident, id }) in path.iter().enumerate() {
1910 debug!("resolve_path ident {} {:?} {:?}", i, ident, id);
1911 let record_segment_res = |this: &mut Self, res| {
1912 if record_used {
1913 if let Some(id) = id {
1914 if !this.partial_res_map.contains_key(&id) {
1915 assert!(id != ast::DUMMY_NODE_ID, "Trying to resolve dummy id");
1916 this.record_partial_res(id, PartialRes::new(res));
1917 }
1918 }
1919 }
1920 };
1921
1922 let is_last = i == path.len() - 1;
1923 let ns = if is_last { opt_ns.unwrap_or(TypeNS) } else { TypeNS };
1924 let name = ident.name;
1925
1926 allow_super &= ns == TypeNS &&
1927 (name == kw::SelfLower ||
1928 name == kw::Super);
1929
1930 if ns == TypeNS {
1931 if allow_super && name == kw::Super {
1932 let mut ctxt = ident.span.ctxt().modern();
1933 let self_module = match i {
1934 0 => Some(self.resolve_self(&mut ctxt, parent_scope.module)),
1935 _ => match module {
1936 Some(ModuleOrUniformRoot::Module(module)) => Some(module),
1937 _ => None,
1938 },
1939 };
1940 if let Some(self_module) = self_module {
1941 if let Some(parent) = self_module.parent {
1942 module = Some(ModuleOrUniformRoot::Module(
1943 self.resolve_self(&mut ctxt, parent)));
1944 continue;
1945 }
1946 }
1947 let msg = "there are too many initial `super`s.".to_string();
1948 return PathResult::Failed {
1949 span: ident.span,
1950 label: msg,
1951 suggestion: None,
1952 is_error_from_last_segment: false,
1953 };
1954 }
1955 if i == 0 {
1956 if name == kw::SelfLower {
1957 let mut ctxt = ident.span.ctxt().modern();
1958 module = Some(ModuleOrUniformRoot::Module(
1959 self.resolve_self(&mut ctxt, parent_scope.module)));
1960 continue;
1961 }
1962 if name == kw::PathRoot && ident.span.rust_2018() {
1963 module = Some(ModuleOrUniformRoot::ExternPrelude);
1964 continue;
1965 }
1966 if name == kw::PathRoot &&
1967 ident.span.rust_2015() && self.session.rust_2018() {
1968 // `::a::b` from 2015 macro on 2018 global edition
1969 module = Some(ModuleOrUniformRoot::CrateRootAndExternPrelude);
1970 continue;
1971 }
1972 if name == kw::PathRoot ||
1973 name == kw::Crate ||
1974 name == kw::DollarCrate {
1975 // `::a::b`, `crate::a::b` or `$crate::a::b`
1976 module = Some(ModuleOrUniformRoot::Module(
1977 self.resolve_crate_root(ident)));
1978 continue;
1979 }
1980 }
1981 }
1982
1983 // Report special messages for path segment keywords in wrong positions.
1984 if ident.is_path_segment_keyword() && i != 0 {
1985 let name_str = if name == kw::PathRoot {
1986 "crate root".to_string()
1987 } else {
1988 format!("`{}`", name)
1989 };
1990 let label = if i == 1 && path[0].ident.name == kw::PathRoot {
1991 format!("global paths cannot start with {}", name_str)
1992 } else {
1993 format!("{} in paths can only be used in start position", name_str)
1994 };
1995 return PathResult::Failed {
1996 span: ident.span,
1997 label,
1998 suggestion: None,
1999 is_error_from_last_segment: false,
2000 };
2001 }
2002
2003 let binding = if let Some(module) = module {
2004 self.resolve_ident_in_module(
2005 module, ident, ns, parent_scope, record_used, path_span
2006 )
2007 } else if ribs.is_none() || opt_ns.is_none() || opt_ns == Some(MacroNS) {
2008 let scopes = ScopeSet::All(ns, opt_ns.is_none());
2009 self.early_resolve_ident_in_lexical_scope(ident, scopes, parent_scope, record_used,
2010 record_used, path_span)
2011 } else {
2012 let record_used_id =
2013 if record_used { crate_lint.node_id().or(Some(CRATE_NODE_ID)) } else { None };
2014 match self.resolve_ident_in_lexical_scope(
2015 ident, ns, parent_scope, record_used_id, path_span, &ribs.unwrap()[ns]
2016 ) {
2017 // we found a locally-imported or available item/module
2018 Some(LexicalScopeBinding::Item(binding)) => Ok(binding),
2019 // we found a local variable or type param
2020 Some(LexicalScopeBinding::Res(res))
2021 if opt_ns == Some(TypeNS) || opt_ns == Some(ValueNS) => {
2022 record_segment_res(self, res);
2023 return PathResult::NonModule(PartialRes::with_unresolved_segments(
2024 res, path.len() - 1
2025 ));
2026 }
2027 _ => Err(Determinacy::determined(record_used)),
2028 }
2029 };
2030
2031 match binding {
2032 Ok(binding) => {
2033 if i == 1 {
2034 second_binding = Some(binding);
2035 }
2036 let res = binding.res();
2037 let maybe_assoc = opt_ns != Some(MacroNS) && PathSource::Type.is_expected(res);
2038 if let Some(next_module) = binding.module() {
2039 module = Some(ModuleOrUniformRoot::Module(next_module));
2040 record_segment_res(self, res);
2041 } else if res == Res::ToolMod && i + 1 != path.len() {
2042 if binding.is_import() {
2043 self.session.struct_span_err(
2044 ident.span, "cannot use a tool module through an import"
2045 ).span_note(
2046 binding.span, "the tool module imported here"
2047 ).emit();
2048 }
2049 let res = Res::NonMacroAttr(NonMacroAttrKind::Tool);
2050 return PathResult::NonModule(PartialRes::new(res));
2051 } else if res == Res::Err {
2052 return PathResult::NonModule(PartialRes::new(Res::Err));
2053 } else if opt_ns.is_some() && (is_last || maybe_assoc) {
2054 self.lint_if_path_starts_with_module(
2055 crate_lint,
2056 path,
2057 path_span,
2058 second_binding,
2059 );
2060 return PathResult::NonModule(PartialRes::with_unresolved_segments(
2061 res, path.len() - i - 1
2062 ));
2063 } else {
2064 let label = format!(
2065 "`{}` is {} {}, not a module",
2066 ident,
2067 res.article(),
2068 res.descr(),
2069 );
2070
2071 return PathResult::Failed {
2072 span: ident.span,
2073 label,
2074 suggestion: None,
2075 is_error_from_last_segment: is_last,
2076 };
2077 }
2078 }
2079 Err(Undetermined) => return PathResult::Indeterminate,
2080 Err(Determined) => {
2081 if let Some(ModuleOrUniformRoot::Module(module)) = module {
2082 if opt_ns.is_some() && !module.is_normal() {
2083 return PathResult::NonModule(PartialRes::with_unresolved_segments(
2084 module.res().unwrap(), path.len() - i
2085 ));
2086 }
2087 }
2088 let module_res = match module {
2089 Some(ModuleOrUniformRoot::Module(module)) => module.res(),
2090 _ => None,
2091 };
2092 let (label, suggestion) = if module_res == self.graph_root.res() {
2093 let is_mod = |res| {
2094 match res { Res::Def(DefKind::Mod, _) => true, _ => false }
2095 };
2096 let mut candidates =
2097 self.lookup_import_candidates(ident, TypeNS, is_mod);
2098 candidates.sort_by_cached_key(|c| {
2099 (c.path.segments.len(), pprust::path_to_string(&c.path))
2100 });
2101 if let Some(candidate) = candidates.get(0) {
2102 (
2103 String::from("unresolved import"),
2104 Some((
2105 vec![(ident.span, pprust::path_to_string(&candidate.path))],
2106 String::from("a similar path exists"),
2107 Applicability::MaybeIncorrect,
2108 )),
2109 )
2110 } else if !ident.is_reserved() {
2111 (format!("maybe a missing crate `{}`?", ident), None)
2112 } else {
2113 // the parser will already have complained about the keyword being used
2114 return PathResult::NonModule(PartialRes::new(Res::Err));
2115 }
2116 } else if i == 0 {
2117 (format!("use of undeclared type or module `{}`", ident), None)
2118 } else {
2119 (format!("could not find `{}` in `{}`", ident, path[i - 1].ident), None)
2120 };
2121 return PathResult::Failed {
2122 span: ident.span,
2123 label,
2124 suggestion,
2125 is_error_from_last_segment: is_last,
2126 };
2127 }
2128 }
2129 }
2130
2131 self.lint_if_path_starts_with_module(crate_lint, path, path_span, second_binding);
2132
2133 PathResult::Module(match module {
2134 Some(module) => module,
2135 None if path.is_empty() => ModuleOrUniformRoot::CurrentScope,
2136 _ => span_bug!(path_span, "resolve_path: non-empty path `{:?}` has no module", path),
2137 })
2138 }
2139
2140 fn lint_if_path_starts_with_module(
2141 &mut self,
2142 crate_lint: CrateLint,
2143 path: &[Segment],
2144 path_span: Span,
2145 second_binding: Option<&NameBinding<'_>>,
2146 ) {
2147 let (diag_id, diag_span) = match crate_lint {
2148 CrateLint::No => return,
2149 CrateLint::SimplePath(id) => (id, path_span),
2150 CrateLint::UsePath { root_id, root_span } => (root_id, root_span),
2151 CrateLint::QPathTrait { qpath_id, qpath_span } => (qpath_id, qpath_span),
2152 };
2153
2154 let first_name = match path.get(0) {
2155 // In the 2018 edition this lint is a hard error, so nothing to do
2156 Some(seg) if seg.ident.span.rust_2015() && self.session.rust_2015() => seg.ident.name,
2157 _ => return,
2158 };
2159
2160 // We're only interested in `use` paths which should start with
2161 // `{{root}}` currently.
2162 if first_name != kw::PathRoot {
2163 return
2164 }
2165
2166 match path.get(1) {
2167 // If this import looks like `crate::...` it's already good
2168 Some(Segment { ident, .. }) if ident.name == kw::Crate => return,
2169 // Otherwise go below to see if it's an extern crate
2170 Some(_) => {}
2171 // If the path has length one (and it's `PathRoot` most likely)
2172 // then we don't know whether we're gonna be importing a crate or an
2173 // item in our crate. Defer this lint to elsewhere
2174 None => return,
2175 }
2176
2177 // If the first element of our path was actually resolved to an
2178 // `ExternCrate` (also used for `crate::...`) then no need to issue a
2179 // warning, this looks all good!
2180 if let Some(binding) = second_binding {
2181 if let NameBindingKind::Import { directive: d, .. } = binding.kind {
2182 // Careful: we still want to rewrite paths from
2183 // renamed extern crates.
2184 if let ImportDirectiveSubclass::ExternCrate { source: None, .. } = d.subclass {
2185 return
2186 }
2187 }
2188 }
2189
2190 let diag = lint::builtin::BuiltinLintDiagnostics
2191 ::AbsPathWithModule(diag_span);
2192 self.lint_buffer.buffer_lint_with_diagnostic(
2193 lint::builtin::ABSOLUTE_PATHS_NOT_STARTING_WITH_CRATE,
2194 diag_id, diag_span,
2195 "absolute paths must start with `self`, `super`, \
2196 `crate`, or an external crate name in the 2018 edition",
2197 diag);
2198 }
2199
2200 // Validate a local resolution (from ribs).
2201 fn validate_res_from_ribs(
2202 &mut self,
2203 rib_index: usize,
2204 rib_ident: Ident,
2205 res: Res,
2206 record_used: bool,
2207 span: Span,
2208 all_ribs: &[Rib<'a>],
2209 ) -> Res {
2210 debug!("validate_res_from_ribs({:?})", res);
2211 let ribs = &all_ribs[rib_index + 1..];
2212
2213 // An invalid forward use of a type parameter from a previous default.
2214 if let ForwardTyParamBanRibKind = all_ribs[rib_index].kind {
2215 if record_used {
2216 let res_error = if rib_ident.name == kw::SelfUpper {
2217 ResolutionError::SelfInTyParamDefault
2218 } else {
2219 ResolutionError::ForwardDeclaredTyParam
2220 };
2221 self.report_error(span, res_error);
2222 }
2223 assert_eq!(res, Res::Err);
2224 return Res::Err;
2225 }
2226
2227 match res {
2228 Res::Local(_) => {
2229 use ResolutionError::*;
2230 let mut res_err = None;
2231
2232 for rib in ribs {
2233 match rib.kind {
2234 NormalRibKind | ModuleRibKind(..) | MacroDefinition(..) |
2235 ForwardTyParamBanRibKind => {
2236 // Nothing to do. Continue.
2237 }
2238 ItemRibKind(_) | FnItemRibKind | AssocItemRibKind => {
2239 // This was an attempt to access an upvar inside a
2240 // named function item. This is not allowed, so we
2241 // report an error.
2242 if record_used {
2243 // We don't immediately trigger a resolve error, because
2244 // we want certain other resolution errors (namely those
2245 // emitted for `ConstantItemRibKind` below) to take
2246 // precedence.
2247 res_err = Some(CannotCaptureDynamicEnvironmentInFnItem);
2248 }
2249 }
2250 ConstantItemRibKind => {
2251 // Still doesn't deal with upvars
2252 if record_used {
2253 self.report_error(span, AttemptToUseNonConstantValueInConstant);
2254 }
2255 return Res::Err;
2256 }
2257 }
2258 }
2259 if let Some(res_err) = res_err {
2260 self.report_error(span, res_err);
2261 return Res::Err;
2262 }
2263 }
2264 Res::Def(DefKind::TyParam, _) | Res::SelfTy(..) => {
2265 for rib in ribs {
2266 let has_generic_params = match rib.kind {
2267 NormalRibKind | AssocItemRibKind |
2268 ModuleRibKind(..) | MacroDefinition(..) | ForwardTyParamBanRibKind |
2269 ConstantItemRibKind => {
2270 // Nothing to do. Continue.
2271 continue;
2272 }
2273 // This was an attempt to use a type parameter outside its scope.
2274 ItemRibKind(has_generic_params) => has_generic_params,
2275 FnItemRibKind => HasGenericParams::Yes,
2276 };
2277
2278 if record_used {
2279 self.report_error(span, ResolutionError::GenericParamsFromOuterFunction(
2280 res, has_generic_params));
2281 }
2282 return Res::Err;
2283 }
2284 }
2285 Res::Def(DefKind::ConstParam, _) => {
2286 let mut ribs = ribs.iter().peekable();
2287 if let Some(Rib { kind: FnItemRibKind, .. }) = ribs.peek() {
2288 // When declaring const parameters inside function signatures, the first rib
2289 // is always a `FnItemRibKind`. In this case, we can skip it, to avoid it
2290 // (spuriously) conflicting with the const param.
2291 ribs.next();
2292 }
2293 for rib in ribs {
2294 let has_generic_params = match rib.kind {
2295 ItemRibKind(has_generic_params) => has_generic_params,
2296 FnItemRibKind => HasGenericParams::Yes,
2297 _ => continue,
2298 };
2299
2300 // This was an attempt to use a const parameter outside its scope.
2301 if record_used {
2302 self.report_error(span, ResolutionError::GenericParamsFromOuterFunction(
2303 res, has_generic_params));
2304 }
2305 return Res::Err;
2306 }
2307 }
2308 _ => {}
2309 }
2310 res
2311 }
2312
2313 fn record_partial_res(&mut self, node_id: NodeId, resolution: PartialRes) {
2314 debug!("(recording res) recording {:?} for {}", resolution, node_id);
2315 if let Some(prev_res) = self.partial_res_map.insert(node_id, resolution) {
2316 panic!("path resolved multiple times ({:?} before, {:?} now)", prev_res, resolution);
2317 }
2318 }
2319
2320 fn is_accessible_from(&self, vis: ty::Visibility, module: Module<'a>) -> bool {
2321 vis.is_accessible_from(module.normal_ancestor_id, self)
2322 }
2323
2324 fn set_binding_parent_module(&mut self, binding: &'a NameBinding<'a>, module: Module<'a>) {
2325 if let Some(old_module) = self.binding_parent_modules.insert(PtrKey(binding), module) {
2326 if !ptr::eq(module, old_module) {
2327 span_bug!(binding.span, "parent module is reset for binding");
2328 }
2329 }
2330 }
2331
2332 fn disambiguate_legacy_vs_modern(
2333 &self,
2334 legacy: &'a NameBinding<'a>,
2335 modern: &'a NameBinding<'a>,
2336 ) -> bool {
2337 // Some non-controversial subset of ambiguities "modern macro name" vs "macro_rules"
2338 // is disambiguated to mitigate regressions from macro modularization.
2339 // Scoping for `macro_rules` behaves like scoping for `let` at module level, in general.
2340 match (self.binding_parent_modules.get(&PtrKey(legacy)),
2341 self.binding_parent_modules.get(&PtrKey(modern))) {
2342 (Some(legacy), Some(modern)) =>
2343 legacy.normal_ancestor_id == modern.normal_ancestor_id &&
2344 modern.is_ancestor_of(legacy),
2345 _ => false,
2346 }
2347 }
2348
2349 fn binding_description(&self, b: &NameBinding<'_>, ident: Ident, from_prelude: bool) -> String {
2350 let res = b.res();
2351 if b.span.is_dummy() {
2352 let add_built_in = match b.res() {
2353 // These already contain the "built-in" prefix or look bad with it.
2354 Res::NonMacroAttr(..) | Res::PrimTy(..) | Res::ToolMod => false,
2355 _ => true,
2356 };
2357 let (built_in, from) = if from_prelude {
2358 ("", " from prelude")
2359 } else if b.is_extern_crate() && !b.is_import() &&
2360 self.session.opts.externs.get(&ident.as_str()).is_some() {
2361 ("", " passed with `--extern`")
2362 } else if add_built_in {
2363 (" built-in", "")
2364 } else {
2365 ("", "")
2366 };
2367
2368 let article = if built_in.is_empty() { res.article() } else { "a" };
2369 format!("{a}{built_in} {thing}{from}",
2370 a = article, thing = res.descr(), built_in = built_in, from = from)
2371 } else {
2372 let introduced = if b.is_import() { "imported" } else { "defined" };
2373 format!("the {thing} {introduced} here",
2374 thing = res.descr(), introduced = introduced)
2375 }
2376 }
2377
2378 fn report_ambiguity_error(&self, ambiguity_error: &AmbiguityError<'_>) {
2379 let AmbiguityError { kind, ident, b1, b2, misc1, misc2 } = *ambiguity_error;
2380 let (b1, b2, misc1, misc2, swapped) = if b2.span.is_dummy() && !b1.span.is_dummy() {
2381 // We have to print the span-less alternative first, otherwise formatting looks bad.
2382 (b2, b1, misc2, misc1, true)
2383 } else {
2384 (b1, b2, misc1, misc2, false)
2385 };
2386
2387 let mut err = struct_span_err!(self.session, ident.span, E0659,
2388 "`{ident}` is ambiguous ({why})",
2389 ident = ident, why = kind.descr());
2390 err.span_label(ident.span, "ambiguous name");
2391
2392 let mut could_refer_to = |b: &NameBinding<'_>, misc: AmbiguityErrorMisc, also: &str| {
2393 let what = self.binding_description(b, ident, misc == AmbiguityErrorMisc::FromPrelude);
2394 let note_msg = format!("`{ident}` could{also} refer to {what}",
2395 ident = ident, also = also, what = what);
2396
2397 let thing = b.res().descr();
2398 let mut help_msgs = Vec::new();
2399 if b.is_glob_import() && (kind == AmbiguityKind::GlobVsGlob ||
2400 kind == AmbiguityKind::GlobVsExpanded ||
2401 kind == AmbiguityKind::GlobVsOuter &&
2402 swapped != also.is_empty()) {
2403 help_msgs.push(format!("consider adding an explicit import of \
2404 `{ident}` to disambiguate", ident = ident))
2405 }
2406 if b.is_extern_crate() && ident.span.rust_2018() {
2407 help_msgs.push(format!(
2408 "use `::{ident}` to refer to this {thing} unambiguously",
2409 ident = ident, thing = thing,
2410 ))
2411 }
2412 if misc == AmbiguityErrorMisc::SuggestCrate {
2413 help_msgs.push(format!(
2414 "use `crate::{ident}` to refer to this {thing} unambiguously",
2415 ident = ident, thing = thing,
2416 ))
2417 } else if misc == AmbiguityErrorMisc::SuggestSelf {
2418 help_msgs.push(format!(
2419 "use `self::{ident}` to refer to this {thing} unambiguously",
2420 ident = ident, thing = thing,
2421 ))
2422 }
2423
2424 err.span_note(b.span, &note_msg);
2425 for (i, help_msg) in help_msgs.iter().enumerate() {
2426 let or = if i == 0 { "" } else { "or " };
2427 err.help(&format!("{}{}", or, help_msg));
2428 }
2429 };
2430
2431 could_refer_to(b1, misc1, "");
2432 could_refer_to(b2, misc2, " also");
2433 err.emit();
2434 }
2435
2436 fn report_errors(&mut self, krate: &Crate) {
2437 self.report_with_use_injections(krate);
2438
2439 for &(span_use, span_def) in &self.macro_expanded_macro_export_errors {
2440 let msg = "macro-expanded `macro_export` macros from the current crate \
2441 cannot be referred to by absolute paths";
2442 self.lint_buffer.buffer_lint_with_diagnostic(
2443 lint::builtin::MACRO_EXPANDED_MACRO_EXPORTS_ACCESSED_BY_ABSOLUTE_PATHS,
2444 CRATE_NODE_ID, span_use, msg,
2445 lint::builtin::BuiltinLintDiagnostics::
2446 MacroExpandedMacroExportsAccessedByAbsolutePaths(span_def),
2447 );
2448 }
2449
2450 for ambiguity_error in &self.ambiguity_errors {
2451 self.report_ambiguity_error(ambiguity_error);
2452 }
2453
2454 let mut reported_spans = FxHashSet::default();
2455 for &PrivacyError(dedup_span, ident, binding) in &self.privacy_errors {
2456 if reported_spans.insert(dedup_span) {
2457 let session = &self.session;
2458 let mk_struct_span_error = |is_constructor| {
2459 struct_span_err!(
2460 session,
2461 ident.span,
2462 E0603,
2463 "{}{} `{}` is private",
2464 binding.res().descr(),
2465 if is_constructor { " constructor"} else { "" },
2466 ident.name,
2467 )
2468 };
2469
2470 let mut err = if let NameBindingKind::Res(
2471 Res::Def(DefKind::Ctor(CtorOf::Struct, CtorKind::Fn), ctor_def_id), _
2472 ) = binding.kind {
2473 let def_id = (&*self).parent(ctor_def_id).expect("no parent for a constructor");
2474 if let Some(fields) = self.field_names.get(&def_id) {
2475 let mut err = mk_struct_span_error(true);
2476 let first_field = fields.first().expect("empty field list in the map");
2477 err.span_label(
2478 fields.iter().fold(first_field.span, |acc, field| acc.to(field.span)),
2479 "a constructor is private if any of the fields is private",
2480 );
2481 err
2482 } else {
2483 mk_struct_span_error(false)
2484 }
2485 } else {
2486 mk_struct_span_error(false)
2487 };
2488
2489 err.emit();
2490 }
2491 }
2492 }
2493
2494 fn report_with_use_injections(&mut self, krate: &Crate) {
2495 for UseError { mut err, candidates, node_id, better } in self.use_injections.drain(..) {
2496 let (span, found_use) = UsePlacementFinder::check(krate, node_id);
2497 if !candidates.is_empty() {
2498 diagnostics::show_candidates(&mut err, span, &candidates, better, found_use);
2499 }
2500 err.emit();
2501 }
2502 }
2503
2504 fn report_conflict<'b>(&mut self,
2505 parent: Module<'_>,
2506 ident: Ident,
2507 ns: Namespace,
2508 new_binding: &NameBinding<'b>,
2509 old_binding: &NameBinding<'b>) {
2510 // Error on the second of two conflicting names
2511 if old_binding.span.lo() > new_binding.span.lo() {
2512 return self.report_conflict(parent, ident, ns, old_binding, new_binding);
2513 }
2514
2515 let container = match parent.kind {
2516 ModuleKind::Def(DefKind::Mod, _, _) => "module",
2517 ModuleKind::Def(DefKind::Trait, _, _) => "trait",
2518 ModuleKind::Block(..) => "block",
2519 _ => "enum",
2520 };
2521
2522 let old_noun = match old_binding.is_import() {
2523 true => "import",
2524 false => "definition",
2525 };
2526
2527 let new_participle = match new_binding.is_import() {
2528 true => "imported",
2529 false => "defined",
2530 };
2531
2532 let (name, span) = (ident.name, self.session.source_map().def_span(new_binding.span));
2533
2534 if let Some(s) = self.name_already_seen.get(&name) {
2535 if s == &span {
2536 return;
2537 }
2538 }
2539
2540 let old_kind = match (ns, old_binding.module()) {
2541 (ValueNS, _) => "value",
2542 (MacroNS, _) => "macro",
2543 (TypeNS, _) if old_binding.is_extern_crate() => "extern crate",
2544 (TypeNS, Some(module)) if module.is_normal() => "module",
2545 (TypeNS, Some(module)) if module.is_trait() => "trait",
2546 (TypeNS, _) => "type",
2547 };
2548
2549 let msg = format!("the name `{}` is defined multiple times", name);
2550
2551 let mut err = match (old_binding.is_extern_crate(), new_binding.is_extern_crate()) {
2552 (true, true) => struct_span_err!(self.session, span, E0259, "{}", msg),
2553 (true, _) | (_, true) => match new_binding.is_import() && old_binding.is_import() {
2554 true => struct_span_err!(self.session, span, E0254, "{}", msg),
2555 false => struct_span_err!(self.session, span, E0260, "{}", msg),
2556 },
2557 _ => match (old_binding.is_import(), new_binding.is_import()) {
2558 (false, false) => struct_span_err!(self.session, span, E0428, "{}", msg),
2559 (true, true) => struct_span_err!(self.session, span, E0252, "{}", msg),
2560 _ => struct_span_err!(self.session, span, E0255, "{}", msg),
2561 },
2562 };
2563
2564 err.note(&format!("`{}` must be defined only once in the {} namespace of this {}",
2565 name,
2566 ns.descr(),
2567 container));
2568
2569 err.span_label(span, format!("`{}` re{} here", name, new_participle));
2570 err.span_label(
2571 self.session.source_map().def_span(old_binding.span),
2572 format!("previous {} of the {} `{}` here", old_noun, old_kind, name),
2573 );
2574
2575 // See https://github.com/rust-lang/rust/issues/32354
2576 use NameBindingKind::Import;
2577 let directive = match (&new_binding.kind, &old_binding.kind) {
2578 // If there are two imports where one or both have attributes then prefer removing the
2579 // import without attributes.
2580 (Import { directive: new, .. }, Import { directive: old, .. }) if {
2581 !new_binding.span.is_dummy() && !old_binding.span.is_dummy() &&
2582 (new.has_attributes || old.has_attributes)
2583 } => {
2584 if old.has_attributes {
2585 Some((new, new_binding.span, true))
2586 } else {
2587 Some((old, old_binding.span, true))
2588 }
2589 },
2590 // Otherwise prioritize the new binding.
2591 (Import { directive, .. }, other) if !new_binding.span.is_dummy() =>
2592 Some((directive, new_binding.span, other.is_import())),
2593 (other, Import { directive, .. }) if !old_binding.span.is_dummy() =>
2594 Some((directive, old_binding.span, other.is_import())),
2595 _ => None,
2596 };
2597
2598 // Check if the target of the use for both bindings is the same.
2599 let duplicate = new_binding.res().opt_def_id() == old_binding.res().opt_def_id();
2600 let has_dummy_span = new_binding.span.is_dummy() || old_binding.span.is_dummy();
2601 let from_item = self.extern_prelude.get(&ident)
2602 .map(|entry| entry.introduced_by_item)
2603 .unwrap_or(true);
2604 // Only suggest removing an import if both bindings are to the same def, if both spans
2605 // aren't dummy spans. Further, if both bindings are imports, then the ident must have
2606 // been introduced by a item.
2607 let should_remove_import = duplicate && !has_dummy_span &&
2608 ((new_binding.is_extern_crate() || old_binding.is_extern_crate()) || from_item);
2609
2610 match directive {
2611 Some((directive, span, true)) if should_remove_import && directive.is_nested() =>
2612 self.add_suggestion_for_duplicate_nested_use(&mut err, directive, span),
2613 Some((directive, _, true)) if should_remove_import && !directive.is_glob() => {
2614 // Simple case - remove the entire import. Due to the above match arm, this can
2615 // only be a single use so just remove it entirely.
2616 err.tool_only_span_suggestion(
2617 directive.use_span_with_attributes,
2618 "remove unnecessary import",
2619 String::new(),
2620 Applicability::MaybeIncorrect,
2621 );
2622 },
2623 Some((directive, span, _)) =>
2624 self.add_suggestion_for_rename_of_use(&mut err, name, directive, span),
2625 _ => {},
2626 }
2627
2628 err.emit();
2629 self.name_already_seen.insert(name, span);
2630 }
2631
2632 /// This function adds a suggestion to change the binding name of a new import that conflicts
2633 /// with an existing import.
2634 ///
2635 /// ```ignore (diagnostic)
2636 /// help: you can use `as` to change the binding name of the import
2637 /// |
2638 /// LL | use foo::bar as other_bar;
2639 /// | ^^^^^^^^^^^^^^^^^^^^^
2640 /// ```
2641 fn add_suggestion_for_rename_of_use(
2642 &self,
2643 err: &mut DiagnosticBuilder<'_>,
2644 name: Name,
2645 directive: &ImportDirective<'_>,
2646 binding_span: Span,
2647 ) {
2648 let suggested_name = if name.as_str().chars().next().unwrap().is_uppercase() {
2649 format!("Other{}", name)
2650 } else {
2651 format!("other_{}", name)
2652 };
2653
2654 let mut suggestion = None;
2655 match directive.subclass {
2656 ImportDirectiveSubclass::SingleImport { type_ns_only: true, .. } =>
2657 suggestion = Some(format!("self as {}", suggested_name)),
2658 ImportDirectiveSubclass::SingleImport { source, .. } => {
2659 if let Some(pos) = source.span.hi().0.checked_sub(binding_span.lo().0)
2660 .map(|pos| pos as usize) {
2661 if let Ok(snippet) = self.session.source_map()
2662 .span_to_snippet(binding_span) {
2663 if pos <= snippet.len() {
2664 suggestion = Some(format!(
2665 "{} as {}{}",
2666 &snippet[..pos],
2667 suggested_name,
2668 if snippet.ends_with(";") { ";" } else { "" }
2669 ))
2670 }
2671 }
2672 }
2673 }
2674 ImportDirectiveSubclass::ExternCrate { source, target, .. } =>
2675 suggestion = Some(format!(
2676 "extern crate {} as {};",
2677 source.unwrap_or(target.name),
2678 suggested_name,
2679 )),
2680 _ => unreachable!(),
2681 }
2682
2683 let rename_msg = "you can use `as` to change the binding name of the import";
2684 if let Some(suggestion) = suggestion {
2685 err.span_suggestion(
2686 binding_span,
2687 rename_msg,
2688 suggestion,
2689 Applicability::MaybeIncorrect,
2690 );
2691 } else {
2692 err.span_label(binding_span, rename_msg);
2693 }
2694 }
2695
2696 /// This function adds a suggestion to remove a unnecessary binding from an import that is
2697 /// nested. In the following example, this function will be invoked to remove the `a` binding
2698 /// in the second use statement:
2699 ///
2700 /// ```ignore (diagnostic)
2701 /// use issue_52891::a;
2702 /// use issue_52891::{d, a, e};
2703 /// ```
2704 ///
2705 /// The following suggestion will be added:
2706 ///
2707 /// ```ignore (diagnostic)
2708 /// use issue_52891::{d, a, e};
2709 /// ^-- help: remove unnecessary import
2710 /// ```
2711 ///
2712 /// If the nested use contains only one import then the suggestion will remove the entire
2713 /// line.
2714 ///
2715 /// It is expected that the directive provided is a nested import - this isn't checked by the
2716 /// function. If this invariant is not upheld, this function's behaviour will be unexpected
2717 /// as characters expected by span manipulations won't be present.
2718 fn add_suggestion_for_duplicate_nested_use(
2719 &self,
2720 err: &mut DiagnosticBuilder<'_>,
2721 directive: &ImportDirective<'_>,
2722 binding_span: Span,
2723 ) {
2724 assert!(directive.is_nested());
2725 let message = "remove unnecessary import";
2726
2727 // Two examples will be used to illustrate the span manipulations we're doing:
2728 //
2729 // - Given `use issue_52891::{d, a, e};` where `a` is a duplicate then `binding_span` is
2730 // `a` and `directive.use_span` is `issue_52891::{d, a, e};`.
2731 // - Given `use issue_52891::{d, e, a};` where `a` is a duplicate then `binding_span` is
2732 // `a` and `directive.use_span` is `issue_52891::{d, e, a};`.
2733
2734 let (found_closing_brace, span) = find_span_of_binding_until_next_binding(
2735 self.session, binding_span, directive.use_span,
2736 );
2737
2738 // If there was a closing brace then identify the span to remove any trailing commas from
2739 // previous imports.
2740 if found_closing_brace {
2741 if let Some(span) = extend_span_to_previous_binding(self.session, span) {
2742 err.tool_only_span_suggestion(span, message, String::new(),
2743 Applicability::MaybeIncorrect);
2744 } else {
2745 // Remove the entire line if we cannot extend the span back, this indicates a
2746 // `issue_52891::{self}` case.
2747 err.span_suggestion(directive.use_span_with_attributes, message, String::new(),
2748 Applicability::MaybeIncorrect);
2749 }
2750
2751 return;
2752 }
2753
2754 err.span_suggestion(span, message, String::new(), Applicability::MachineApplicable);
2755 }
2756
2757 fn extern_prelude_get(&mut self, ident: Ident, speculative: bool)
2758 -> Option<&'a NameBinding<'a>> {
2759 if ident.is_path_segment_keyword() {
2760 // Make sure `self`, `super` etc produce an error when passed to here.
2761 return None;
2762 }
2763 self.extern_prelude.get(&ident.modern()).cloned().and_then(|entry| {
2764 if let Some(binding) = entry.extern_crate_item {
2765 if !speculative && entry.introduced_by_item {
2766 self.record_use(ident, TypeNS, binding, false);
2767 }
2768 Some(binding)
2769 } else {
2770 let crate_id = if !speculative {
2771 self.crate_loader.process_path_extern(ident.name, ident.span)
2772 } else if let Some(crate_id) =
2773 self.crate_loader.maybe_process_path_extern(ident.name, ident.span) {
2774 crate_id
2775 } else {
2776 return None;
2777 };
2778 let crate_root = self.get_module(DefId { krate: crate_id, index: CRATE_DEF_INDEX });
2779 Some((crate_root, ty::Visibility::Public, DUMMY_SP, ExpnId::root())
2780 .to_name_binding(self.arenas))
2781 }
2782 })
2783 }
2784
2785 /// Rustdoc uses this to resolve things in a recoverable way. `ResolutionError<'a>`
2786 /// isn't something that can be returned because it can't be made to live that long,
2787 /// and also it's a private type. Fortunately rustdoc doesn't need to know the error,
2788 /// just that an error occurred.
2789 // FIXME(Manishearth): intra-doc links won't get warned of epoch changes.
2790 pub fn resolve_str_path_error(
2791 &mut self, span: Span, path_str: &str, ns: Namespace, module_id: NodeId
2792 ) -> Result<(ast::Path, Res), ()> {
2793 let path = if path_str.starts_with("::") {
2794 ast::Path {
2795 span,
2796 segments: iter::once(Ident::with_dummy_span(kw::PathRoot))
2797 .chain({
2798 path_str.split("::").skip(1).map(Ident::from_str)
2799 })
2800 .map(|i| self.new_ast_path_segment(i))
2801 .collect(),
2802 }
2803 } else {
2804 ast::Path {
2805 span,
2806 segments: path_str
2807 .split("::")
2808 .map(Ident::from_str)
2809 .map(|i| self.new_ast_path_segment(i))
2810 .collect(),
2811 }
2812 };
2813 let module = self.block_map.get(&module_id).copied().unwrap_or_else(|| {
2814 let def_id = self.definitions.local_def_id(module_id);
2815 self.module_map.get(&def_id).copied().unwrap_or(self.graph_root)
2816 });
2817 let parent_scope = &ParentScope::module(module);
2818 let res = self.resolve_ast_path(&path, ns, parent_scope).map_err(|_| ())?;
2819 Ok((path, res))
2820 }
2821
2822 // Resolve a path passed from rustdoc or HIR lowering.
2823 fn resolve_ast_path(
2824 &mut self,
2825 path: &ast::Path,
2826 ns: Namespace,
2827 parent_scope: &ParentScope<'a>,
2828 ) -> Result<Res, (Span, ResolutionError<'a>)> {
2829 match self.resolve_path(
2830 &Segment::from_path(path), Some(ns), parent_scope, true, path.span, CrateLint::No
2831 ) {
2832 PathResult::Module(ModuleOrUniformRoot::Module(module)) =>
2833 Ok(module.res().unwrap()),
2834 PathResult::NonModule(path_res) if path_res.unresolved_segments() == 0 =>
2835 Ok(path_res.base_res()),
2836 PathResult::NonModule(..) => {
2837 Err((path.span, ResolutionError::FailedToResolve {
2838 label: String::from("type-relative paths are not supported in this context"),
2839 suggestion: None,
2840 }))
2841 }
2842 PathResult::Module(..) | PathResult::Indeterminate => unreachable!(),
2843 PathResult::Failed { span, label, suggestion, .. } => {
2844 Err((span, ResolutionError::FailedToResolve {
2845 label,
2846 suggestion,
2847 }))
2848 }
2849 }
2850 }
2851
2852 fn new_ast_path_segment(&self, ident: Ident) -> ast::PathSegment {
2853 let mut seg = ast::PathSegment::from_ident(ident);
2854 seg.id = self.session.next_node_id();
2855 seg
2856 }
2857
2858 // For rustdoc.
2859 pub fn graph_root(&self) -> Module<'a> {
2860 self.graph_root
2861 }
2862
2863 // For rustdoc.
2864 pub fn all_macros(&self) -> &FxHashMap<Name, Res> {
2865 &self.all_macros
2866 }
2867 }
2868
2869 fn names_to_string(names: &[Name]) -> String {
2870 let mut result = String::new();
2871 for (i, name) in names.iter()
2872 .filter(|name| **name != kw::PathRoot)
2873 .enumerate() {
2874 if i > 0 {
2875 result.push_str("::");
2876 }
2877 result.push_str(&name.as_str());
2878 }
2879 result
2880 }
2881
2882 fn path_names_to_string(path: &Path) -> String {
2883 names_to_string(&path.segments.iter()
2884 .map(|seg| seg.ident.name)
2885 .collect::<Vec<_>>())
2886 }
2887
2888 /// A somewhat inefficient routine to obtain the name of a module.
2889 fn module_to_string(module: Module<'_>) -> Option<String> {
2890 let mut names = Vec::new();
2891
2892 fn collect_mod(names: &mut Vec<Name>, module: Module<'_>) {
2893 if let ModuleKind::Def(.., name) = module.kind {
2894 if let Some(parent) = module.parent {
2895 names.push(name);
2896 collect_mod(names, parent);
2897 }
2898 } else {
2899 names.push(Name::intern("<opaque>"));
2900 collect_mod(names, module.parent.unwrap());
2901 }
2902 }
2903 collect_mod(&mut names, module);
2904
2905 if names.is_empty() {
2906 return None;
2907 }
2908 names.reverse();
2909 Some(names_to_string(&names))
2910 }
2911
2912 #[derive(Copy, Clone, Debug)]
2913 enum CrateLint {
2914 /// Do not issue the lint.
2915 No,
2916
2917 /// This lint applies to some arbitrary path; e.g., `impl ::foo::Bar`.
2918 /// In this case, we can take the span of that path.
2919 SimplePath(NodeId),
2920
2921 /// This lint comes from a `use` statement. In this case, what we
2922 /// care about really is the *root* `use` statement; e.g., if we
2923 /// have nested things like `use a::{b, c}`, we care about the
2924 /// `use a` part.
2925 UsePath { root_id: NodeId, root_span: Span },
2926
2927 /// This is the "trait item" from a fully qualified path. For example,
2928 /// we might be resolving `X::Y::Z` from a path like `<T as X::Y>::Z`.
2929 /// The `path_span` is the span of the to the trait itself (`X::Y`).
2930 QPathTrait { qpath_id: NodeId, qpath_span: Span },
2931 }
2932
2933 impl CrateLint {
2934 fn node_id(&self) -> Option<NodeId> {
2935 match *self {
2936 CrateLint::No => None,
2937 CrateLint::SimplePath(id) |
2938 CrateLint::UsePath { root_id: id, .. } |
2939 CrateLint::QPathTrait { qpath_id: id, .. } => Some(id),
2940 }
2941 }
2942 }