]> git.lizzy.rs Git - rust.git/blob - src/librustc_resolve/lib.rs
1660a270cbd4fcbe8ea2b7e29319e90b1d1bd076
[rust.git] / src / librustc_resolve / lib.rs
1 // Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 #![crate_name = "rustc_resolve"]
12 #![unstable(feature = "rustc_private", issue = "27812")]
13 #![crate_type = "dylib"]
14 #![crate_type = "rlib"]
15 #![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
16       html_favicon_url = "https://doc.rust-lang.org/favicon.ico",
17       html_root_url = "https://doc.rust-lang.org/nightly/")]
18 #![cfg_attr(not(stage0), deny(warnings))]
19
20 #![feature(associated_consts)]
21 #![feature(borrow_state)]
22 #![feature(rustc_diagnostic_macros)]
23 #![feature(rustc_private)]
24 #![feature(staged_api)]
25
26 #[macro_use]
27 extern crate log;
28 #[macro_use]
29 extern crate syntax;
30 extern crate syntax_pos;
31 extern crate rustc_errors as errors;
32 extern crate arena;
33 #[macro_use]
34 extern crate rustc;
35
36 use self::Namespace::*;
37 use self::ResolveResult::*;
38 use self::FallbackSuggestion::*;
39 use self::TypeParameters::*;
40 use self::RibKind::*;
41 use self::UseLexicalScopeFlag::*;
42 use self::ModulePrefixResult::*;
43 use self::ParentLink::*;
44
45 use rustc::hir::map::Definitions;
46 use rustc::hir::{self, PrimTy, TyBool, TyChar, TyFloat, TyInt, TyUint, TyStr};
47 use rustc::session::Session;
48 use rustc::lint;
49 use rustc::hir::def::*;
50 use rustc::hir::def_id::{CRATE_DEF_INDEX, DefId};
51 use rustc::ty;
52 use rustc::hir::{Freevar, FreevarMap, TraitCandidate, TraitMap, GlobMap};
53 use rustc::util::nodemap::{NodeMap, NodeSet, FnvHashMap, FnvHashSet};
54
55 use syntax::ext::hygiene::Mark;
56 use syntax::ast::{self, FloatTy};
57 use syntax::ast::{CRATE_NODE_ID, Name, NodeId, CrateNum, IntTy, UintTy};
58 use syntax::parse::token::{self, keywords};
59 use syntax::util::lev_distance::find_best_match_for_name;
60
61 use syntax::visit::{self, FnKind, Visitor};
62 use syntax::ast::{Arm, BindingMode, Block, Crate, Expr, ExprKind};
63 use syntax::ast::{FnDecl, ForeignItem, ForeignItemKind, Generics};
64 use syntax::ast::{Item, ItemKind, ImplItem, ImplItemKind};
65 use syntax::ast::{Local, Mutability, Pat, PatKind, Path};
66 use syntax::ast::{PathSegment, PathParameters, QSelf, TraitItemKind, TraitRef, Ty, TyKind};
67
68 use syntax_pos::Span;
69 use errors::DiagnosticBuilder;
70
71 use std::collections::{HashMap, HashSet};
72 use std::cell::{Cell, RefCell};
73 use std::fmt;
74 use std::mem::replace;
75
76 use resolve_imports::{ImportDirective, NameResolution};
77
78 // NB: This module needs to be declared first so diagnostics are
79 // registered before they are used.
80 mod diagnostics;
81
82 mod check_unused;
83 mod build_reduced_graph;
84 mod resolve_imports;
85 mod assign_ids;
86
87 enum SuggestionType {
88     Macro(String),
89     Function(token::InternedString),
90     NotFound,
91 }
92
93 /// Candidates for a name resolution failure
94 struct SuggestedCandidates {
95     name: String,
96     candidates: Vec<Path>,
97 }
98
99 enum ResolutionError<'a> {
100     /// error E0401: can't use type parameters from outer function
101     TypeParametersFromOuterFunction,
102     /// error E0402: cannot use an outer type parameter in this context
103     OuterTypeParameterContext,
104     /// error E0403: the name is already used for a type parameter in this type parameter list
105     NameAlreadyUsedInTypeParameterList(Name),
106     /// error E0404: is not a trait
107     IsNotATrait(&'a str),
108     /// error E0405: use of undeclared trait name
109     UndeclaredTraitName(&'a str, SuggestedCandidates),
110     /// error E0407: method is not a member of trait
111     MethodNotMemberOfTrait(Name, &'a str),
112     /// error E0437: type is not a member of trait
113     TypeNotMemberOfTrait(Name, &'a str),
114     /// error E0438: const is not a member of trait
115     ConstNotMemberOfTrait(Name, &'a str),
116     /// error E0408: variable `{}` from pattern #{} is not bound in pattern #{}
117     VariableNotBoundInPattern(Name, usize, usize),
118     /// error E0409: variable is bound with different mode in pattern #{} than in pattern #1
119     VariableBoundWithDifferentMode(Name, usize, Span),
120     /// error E0411: use of `Self` outside of an impl or trait
121     SelfUsedOutsideImplOrTrait,
122     /// error E0412: use of undeclared
123     UseOfUndeclared(&'a str, &'a str, SuggestedCandidates),
124     /// error E0415: identifier is bound more than once in this parameter list
125     IdentifierBoundMoreThanOnceInParameterList(&'a str),
126     /// error E0416: identifier is bound more than once in the same pattern
127     IdentifierBoundMoreThanOnceInSamePattern(&'a str),
128     /// error E0422: does not name a struct
129     DoesNotNameAStruct(&'a str),
130     /// error E0423: is a struct variant name, but this expression uses it like a function name
131     StructVariantUsedAsFunction(&'a str),
132     /// error E0424: `self` is not available in a static method
133     SelfNotAvailableInStaticMethod,
134     /// error E0425: unresolved name
135     UnresolvedName {
136         path: &'a str,
137         message: &'a str,
138         context: UnresolvedNameContext<'a>,
139         is_static_method: bool,
140         is_field: bool,
141         def: Def,
142     },
143     /// error E0426: use of undeclared label
144     UndeclaredLabel(&'a str),
145     /// error E0429: `self` imports are only allowed within a { } list
146     SelfImportsOnlyAllowedWithin,
147     /// error E0430: `self` import can only appear once in the list
148     SelfImportCanOnlyAppearOnceInTheList,
149     /// error E0431: `self` import can only appear in an import list with a non-empty prefix
150     SelfImportOnlyInImportListWithNonEmptyPrefix,
151     /// error E0432: unresolved import
152     UnresolvedImport(Option<(&'a str, &'a str)>),
153     /// error E0433: failed to resolve
154     FailedToResolve(&'a str),
155     /// error E0434: can't capture dynamic environment in a fn item
156     CannotCaptureDynamicEnvironmentInFnItem,
157     /// error E0435: attempt to use a non-constant value in a constant
158     AttemptToUseNonConstantValueInConstant,
159     /// error E0530: X bindings cannot shadow Ys
160     BindingShadowsSomethingUnacceptable(&'a str, Name, &'a NameBinding<'a>),
161     /// error E0531: unresolved pattern path kind `name`
162     PatPathUnresolved(&'a str, &'a Path),
163     /// error E0532: expected pattern path kind, found another pattern path kind
164     PatPathUnexpected(&'a str, &'a str, &'a Path),
165 }
166
167 /// Context of where `ResolutionError::UnresolvedName` arose.
168 #[derive(Clone, PartialEq, Eq, Debug)]
169 enum UnresolvedNameContext<'a> {
170     /// `PathIsMod(parent)` indicates that a given path, used in
171     /// expression context, actually resolved to a module rather than
172     /// a value. The optional expression attached to the variant is the
173     /// the parent of the erroneous path expression.
174     PathIsMod(Option<&'a Expr>),
175
176     /// `Other` means we have no extra information about the context
177     /// of the unresolved name error. (Maybe we could eliminate all
178     /// such cases; but for now, this is an information-free default.)
179     Other,
180 }
181
182 fn resolve_error<'b, 'a: 'b, 'c>(resolver: &'b Resolver<'a>,
183                                  span: syntax_pos::Span,
184                                  resolution_error: ResolutionError<'c>) {
185     resolve_struct_error(resolver, span, resolution_error).emit();
186 }
187
188 fn resolve_struct_error<'b, 'a: 'b, 'c>(resolver: &'b Resolver<'a>,
189                                         span: syntax_pos::Span,
190                                         resolution_error: ResolutionError<'c>)
191                                         -> DiagnosticBuilder<'a> {
192     if !resolver.emit_errors {
193         return resolver.session.diagnostic().struct_dummy();
194     }
195
196     match resolution_error {
197         ResolutionError::TypeParametersFromOuterFunction => {
198             let mut err = struct_span_err!(resolver.session,
199                                            span,
200                                            E0401,
201                                            "can't use type parameters from outer function; \
202                                            try using a local type parameter instead");
203             err.span_label(span, &format!("use of type variable from outer function"));
204             err
205         }
206         ResolutionError::OuterTypeParameterContext => {
207             struct_span_err!(resolver.session,
208                              span,
209                              E0402,
210                              "cannot use an outer type parameter in this context")
211         }
212         ResolutionError::NameAlreadyUsedInTypeParameterList(name) => {
213             struct_span_err!(resolver.session,
214                              span,
215                              E0403,
216                              "the name `{}` is already used for a type parameter in this type \
217                               parameter list",
218                              name)
219         }
220         ResolutionError::IsNotATrait(name) => {
221             let mut err = struct_span_err!(resolver.session,
222                                            span,
223                                            E0404,
224                                            "`{}` is not a trait",
225                                            name);
226             err.span_label(span, &format!("not a trait"));
227             err
228         }
229         ResolutionError::UndeclaredTraitName(name, candidates) => {
230             let mut err = struct_span_err!(resolver.session,
231                                            span,
232                                            E0405,
233                                            "trait `{}` is not in scope",
234                                            name);
235             show_candidates(&mut err, &candidates);
236             err.span_label(span, &format!("`{}` is not in scope", name));
237             err
238         }
239         ResolutionError::MethodNotMemberOfTrait(method, trait_) => {
240             struct_span_err!(resolver.session,
241                              span,
242                              E0407,
243                              "method `{}` is not a member of trait `{}`",
244                              method,
245                              trait_)
246         }
247         ResolutionError::TypeNotMemberOfTrait(type_, trait_) => {
248             struct_span_err!(resolver.session,
249                              span,
250                              E0437,
251                              "type `{}` is not a member of trait `{}`",
252                              type_,
253                              trait_)
254         }
255         ResolutionError::ConstNotMemberOfTrait(const_, trait_) => {
256             struct_span_err!(resolver.session,
257                              span,
258                              E0438,
259                              "const `{}` is not a member of trait `{}`",
260                              const_,
261                              trait_)
262         }
263         ResolutionError::VariableNotBoundInPattern(variable_name, from, to) => {
264             struct_span_err!(resolver.session,
265                              span,
266                              E0408,
267                              "variable `{}` from pattern #{} is not bound in pattern #{}",
268                              variable_name,
269                              from,
270                              to)
271         }
272         ResolutionError::VariableBoundWithDifferentMode(variable_name,
273                                                         pattern_number,
274                                                         first_binding_span) => {
275             let mut err = struct_span_err!(resolver.session,
276                              span,
277                              E0409,
278                              "variable `{}` is bound with different mode in pattern #{} than in \
279                               pattern #1",
280                              variable_name,
281                              pattern_number);
282             err.span_label(span, &format!("bound in different ways"));
283             err.span_label(first_binding_span, &format!("first binding"));
284             err
285         }
286         ResolutionError::SelfUsedOutsideImplOrTrait => {
287             let mut err = struct_span_err!(resolver.session,
288                                            span,
289                                            E0411,
290                                            "use of `Self` outside of an impl or trait");
291             err.span_label(span, &format!("used outside of impl or trait"));
292             err
293         }
294         ResolutionError::UseOfUndeclared(kind, name, candidates) => {
295             let mut err = struct_span_err!(resolver.session,
296                                            span,
297                                            E0412,
298                                            "{} `{}` is undefined or not in scope",
299                                            kind,
300                                            name);
301             show_candidates(&mut err, &candidates);
302             err.span_label(span, &format!("undefined or not in scope"));
303             err
304         }
305         ResolutionError::IdentifierBoundMoreThanOnceInParameterList(identifier) => {
306             let mut err = struct_span_err!(resolver.session,
307                              span,
308                              E0415,
309                              "identifier `{}` is bound more than once in this parameter list",
310                              identifier);
311             err.span_label(span, &format!("used as parameter more than once"));
312             err
313         }
314         ResolutionError::IdentifierBoundMoreThanOnceInSamePattern(identifier) => {
315             let mut err = struct_span_err!(resolver.session,
316                              span,
317                              E0416,
318                              "identifier `{}` is bound more than once in the same pattern",
319                              identifier);
320             err.span_label(span, &format!("used in a pattern more than once"));
321             err
322         }
323         ResolutionError::DoesNotNameAStruct(name) => {
324             let mut err = struct_span_err!(resolver.session,
325                              span,
326                              E0422,
327                              "`{}` does not name a structure",
328                              name);
329             err.span_label(span, &format!("not a structure"));
330             err
331         }
332         ResolutionError::StructVariantUsedAsFunction(path_name) => {
333             struct_span_err!(resolver.session,
334                              span,
335                              E0423,
336                              "`{}` is the name of a struct or struct variant, but this expression \
337                              uses it like a function name",
338                              path_name)
339         }
340         ResolutionError::SelfNotAvailableInStaticMethod => {
341             struct_span_err!(resolver.session,
342                              span,
343                              E0424,
344                              "`self` is not available in a static method. Maybe a `self` \
345                              argument is missing?")
346         }
347         ResolutionError::UnresolvedName { path, message: msg, context, is_static_method,
348                                           is_field, def } => {
349             let mut err = struct_span_err!(resolver.session,
350                                            span,
351                                            E0425,
352                                            "unresolved name `{}`{}",
353                                            path,
354                                            msg);
355             match context {
356                 UnresolvedNameContext::Other => {
357                     if msg.is_empty() && is_static_method && is_field {
358                         err.help("this is an associated function, you don't have access to \
359                                   this type's fields or methods");
360                     }
361                 }
362                 UnresolvedNameContext::PathIsMod(parent) => {
363                     err.help(&match parent.map(|parent| &parent.node) {
364                         Some(&ExprKind::Field(_, ident)) => {
365                             format!("to reference an item from the `{module}` module, \
366                                      use `{module}::{ident}`",
367                                     module = path,
368                                     ident = ident.node)
369                         }
370                         Some(&ExprKind::MethodCall(ident, _, _)) => {
371                             format!("to call a function from the `{module}` module, \
372                                      use `{module}::{ident}(..)`",
373                                     module = path,
374                                     ident = ident.node)
375                         }
376                         _ => {
377                             format!("{def} `{module}` cannot be used as an expression",
378                                     def = def.kind_name(),
379                                     module = path)
380                         }
381                     });
382                 }
383             }
384             err
385         }
386         ResolutionError::UndeclaredLabel(name) => {
387             struct_span_err!(resolver.session,
388                              span,
389                              E0426,
390                              "use of undeclared label `{}`",
391                              name)
392         }
393         ResolutionError::SelfImportsOnlyAllowedWithin => {
394             struct_span_err!(resolver.session,
395                              span,
396                              E0429,
397                              "{}",
398                              "`self` imports are only allowed within a { } list")
399         }
400         ResolutionError::SelfImportCanOnlyAppearOnceInTheList => {
401             struct_span_err!(resolver.session,
402                              span,
403                              E0430,
404                              "`self` import can only appear once in the list")
405         }
406         ResolutionError::SelfImportOnlyInImportListWithNonEmptyPrefix => {
407             struct_span_err!(resolver.session,
408                              span,
409                              E0431,
410                              "`self` import can only appear in an import list with a \
411                               non-empty prefix")
412         }
413         ResolutionError::UnresolvedImport(name) => {
414             let msg = match name {
415                 Some((n, p)) => format!("unresolved import `{}`{}", n, p),
416                 None => "unresolved import".to_owned(),
417             };
418             struct_span_err!(resolver.session, span, E0432, "{}", msg)
419         }
420         ResolutionError::FailedToResolve(msg) => {
421             let mut err = struct_span_err!(resolver.session, span, E0433,
422                                            "failed to resolve. {}", msg);
423             err.span_label(span, &msg);
424             err
425         }
426         ResolutionError::CannotCaptureDynamicEnvironmentInFnItem => {
427             struct_span_err!(resolver.session,
428                              span,
429                              E0434,
430                              "{}",
431                              "can't capture dynamic environment in a fn item; use the || { ... } \
432                               closure form instead")
433         }
434         ResolutionError::AttemptToUseNonConstantValueInConstant => {
435             struct_span_err!(resolver.session,
436                              span,
437                              E0435,
438                              "attempt to use a non-constant value in a constant")
439         }
440         ResolutionError::BindingShadowsSomethingUnacceptable(what_binding, name, binding) => {
441             let shadows_what = PathResolution::new(binding.def().unwrap()).kind_name();
442             let mut err = struct_span_err!(resolver.session,
443                                            span,
444                                            E0530,
445                                            "{}s cannot shadow {}s", what_binding, shadows_what);
446             err.span_label(span, &format!("cannot be named the same as a {}", shadows_what));
447             let participle = if binding.is_import() { "imported" } else { "defined" };
448             let msg = &format!("a {} `{}` is {} here", shadows_what, name, participle);
449             err.span_label(binding.span, msg);
450             err
451         }
452         ResolutionError::PatPathUnresolved(expected_what, path) => {
453             struct_span_err!(resolver.session,
454                              span,
455                              E0531,
456                              "unresolved {} `{}`",
457                              expected_what,
458                              path.segments.last().unwrap().identifier)
459         }
460         ResolutionError::PatPathUnexpected(expected_what, found_what, path) => {
461             struct_span_err!(resolver.session,
462                              span,
463                              E0532,
464                              "expected {}, found {} `{}`",
465                              expected_what,
466                              found_what,
467                              path.segments.last().unwrap().identifier)
468         }
469     }
470 }
471
472 #[derive(Copy, Clone)]
473 struct BindingInfo {
474     span: Span,
475     binding_mode: BindingMode,
476 }
477
478 // Map from the name in a pattern to its binding mode.
479 type BindingMap = HashMap<ast::Ident, BindingInfo>;
480
481 #[derive(Copy, Clone, PartialEq, Eq, Debug)]
482 enum PatternSource {
483     Match,
484     IfLet,
485     WhileLet,
486     Let,
487     For,
488     FnParam,
489 }
490
491 impl PatternSource {
492     fn is_refutable(self) -> bool {
493         match self {
494             PatternSource::Match | PatternSource::IfLet | PatternSource::WhileLet => true,
495             PatternSource::Let | PatternSource::For | PatternSource::FnParam  => false,
496         }
497     }
498     fn descr(self) -> &'static str {
499         match self {
500             PatternSource::Match => "match binding",
501             PatternSource::IfLet => "if let binding",
502             PatternSource::WhileLet => "while let binding",
503             PatternSource::Let => "let binding",
504             PatternSource::For => "for binding",
505             PatternSource::FnParam => "function parameter",
506         }
507     }
508 }
509
510 #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
511 pub enum Namespace {
512     TypeNS,
513     ValueNS,
514 }
515
516 impl<'a> Visitor for Resolver<'a> {
517     fn visit_item(&mut self, item: &Item) {
518         self.resolve_item(item);
519     }
520     fn visit_arm(&mut self, arm: &Arm) {
521         self.resolve_arm(arm);
522     }
523     fn visit_block(&mut self, block: &Block) {
524         self.resolve_block(block);
525     }
526     fn visit_expr(&mut self, expr: &Expr) {
527         self.resolve_expr(expr, None);
528     }
529     fn visit_local(&mut self, local: &Local) {
530         self.resolve_local(local);
531     }
532     fn visit_ty(&mut self, ty: &Ty) {
533         self.resolve_type(ty);
534     }
535     fn visit_poly_trait_ref(&mut self, tref: &ast::PolyTraitRef, m: &ast::TraitBoundModifier) {
536         match self.resolve_trait_reference(tref.trait_ref.ref_id, &tref.trait_ref.path, 0) {
537             Ok(def) => self.record_def(tref.trait_ref.ref_id, def),
538             Err(_) => {
539                 // error already reported
540                 self.record_def(tref.trait_ref.ref_id, err_path_resolution())
541             }
542         }
543         visit::walk_poly_trait_ref(self, tref, m);
544     }
545     fn visit_variant(&mut self,
546                      variant: &ast::Variant,
547                      generics: &Generics,
548                      item_id: ast::NodeId) {
549         if let Some(ref dis_expr) = variant.node.disr_expr {
550             // resolve the discriminator expr as a constant
551             self.with_constant_rib(|this| {
552                 this.visit_expr(dis_expr);
553             });
554         }
555
556         // `visit::walk_variant` without the discriminant expression.
557         self.visit_variant_data(&variant.node.data,
558                                 variant.node.name,
559                                 generics,
560                                 item_id,
561                                 variant.span);
562     }
563     fn visit_foreign_item(&mut self, foreign_item: &ForeignItem) {
564         let type_parameters = match foreign_item.node {
565             ForeignItemKind::Fn(_, ref generics) => {
566                 HasTypeParameters(generics, ItemRibKind)
567             }
568             ForeignItemKind::Static(..) => NoTypeParameters,
569         };
570         self.with_type_parameter_rib(type_parameters, |this| {
571             visit::walk_foreign_item(this, foreign_item);
572         });
573     }
574     fn visit_fn(&mut self,
575                 function_kind: FnKind,
576                 declaration: &FnDecl,
577                 block: &Block,
578                 _: Span,
579                 node_id: NodeId) {
580         let rib_kind = match function_kind {
581             FnKind::ItemFn(_, generics, _, _, _, _) => {
582                 self.visit_generics(generics);
583                 ItemRibKind
584             }
585             FnKind::Method(_, sig, _) => {
586                 self.visit_generics(&sig.generics);
587                 MethodRibKind(!sig.decl.has_self())
588             }
589             FnKind::Closure => ClosureRibKind(node_id),
590         };
591         self.resolve_function(rib_kind, declaration, block);
592     }
593 }
594
595 pub type ErrorMessage = Option<(Span, String)>;
596
597 #[derive(Clone, PartialEq, Eq)]
598 pub enum ResolveResult<T> {
599     Failed(ErrorMessage), // Failed to resolve the name, optional helpful error message.
600     Indeterminate, // Couldn't determine due to unresolved globs.
601     Success(T), // Successfully resolved the import.
602 }
603
604 impl<T> ResolveResult<T> {
605     fn and_then<U, F: FnOnce(T) -> ResolveResult<U>>(self, f: F) -> ResolveResult<U> {
606         match self {
607             Failed(msg) => Failed(msg),
608             Indeterminate => Indeterminate,
609             Success(t) => f(t),
610         }
611     }
612
613     fn success(self) -> Option<T> {
614         match self {
615             Success(t) => Some(t),
616             _ => None,
617         }
618     }
619 }
620
621 enum FallbackSuggestion {
622     NoSuggestion,
623     Field,
624     TraitItem,
625     TraitMethod(String),
626 }
627
628 #[derive(Copy, Clone)]
629 enum TypeParameters<'a, 'b> {
630     NoTypeParameters,
631     HasTypeParameters(// Type parameters.
632                       &'b Generics,
633
634                       // The kind of the rib used for type parameters.
635                       RibKind<'a>),
636 }
637
638 // The rib kind controls the translation of local
639 // definitions (`Def::Local`) to upvars (`Def::Upvar`).
640 #[derive(Copy, Clone, Debug)]
641 enum RibKind<'a> {
642     // No translation needs to be applied.
643     NormalRibKind,
644
645     // We passed through a closure scope at the given node ID.
646     // Translate upvars as appropriate.
647     ClosureRibKind(NodeId /* func id */),
648
649     // We passed through an impl or trait and are now in one of its
650     // methods. Allow references to ty params that impl or trait
651     // binds. Disallow any other upvars (including other ty params that are
652     // upvars).
653     //
654     // The boolean value represents the fact that this method is static or not.
655     MethodRibKind(bool),
656
657     // We passed through an item scope. Disallow upvars.
658     ItemRibKind,
659
660     // We're in a constant item. Can't refer to dynamic stuff.
661     ConstantItemRibKind,
662
663     // We passed through a module.
664     ModuleRibKind(Module<'a>),
665
666     // We passed through a `macro_rules!` statement with the given expansion
667     MacroDefinition(Mark),
668 }
669
670 #[derive(Copy, Clone)]
671 enum UseLexicalScopeFlag {
672     DontUseLexicalScope,
673     UseLexicalScope,
674 }
675
676 enum ModulePrefixResult<'a> {
677     NoPrefixFound,
678     PrefixFound(Module<'a>, usize),
679 }
680
681 /// One local scope.
682 #[derive(Debug)]
683 struct Rib<'a> {
684     bindings: HashMap<ast::Ident, Def>,
685     kind: RibKind<'a>,
686 }
687
688 impl<'a> Rib<'a> {
689     fn new(kind: RibKind<'a>) -> Rib<'a> {
690         Rib {
691             bindings: HashMap::new(),
692             kind: kind,
693         }
694     }
695 }
696
697 /// A definition along with the index of the rib it was found on
698 struct LocalDef {
699     ribs: Option<(Namespace, usize)>,
700     def: Def,
701 }
702
703 impl LocalDef {
704     fn from_def(def: Def) -> Self {
705         LocalDef {
706             ribs: None,
707             def: def,
708         }
709     }
710 }
711
712 enum LexicalScopeBinding<'a> {
713     Item(&'a NameBinding<'a>),
714     LocalDef(LocalDef),
715 }
716
717 impl<'a> LexicalScopeBinding<'a> {
718     fn local_def(self) -> LocalDef {
719         match self {
720             LexicalScopeBinding::LocalDef(local_def) => local_def,
721             LexicalScopeBinding::Item(binding) => LocalDef::from_def(binding.def().unwrap()),
722         }
723     }
724
725     fn item(self) -> Option<&'a NameBinding<'a>> {
726         match self {
727             LexicalScopeBinding::Item(binding) => Some(binding),
728             _ => None,
729         }
730     }
731
732     fn module(self) -> Option<Module<'a>> {
733         self.item().and_then(NameBinding::module)
734     }
735 }
736
737 /// The link from a module up to its nearest parent node.
738 #[derive(Clone,Debug)]
739 enum ParentLink<'a> {
740     NoParentLink,
741     ModuleParentLink(Module<'a>, Name),
742     BlockParentLink(Module<'a>, NodeId),
743 }
744
745 /// One node in the tree of modules.
746 pub struct ModuleS<'a> {
747     parent_link: ParentLink<'a>,
748     def: Option<Def>,
749
750     // If the module is an extern crate, `def` is root of the external crate and `extern_crate_id`
751     // is the NodeId of the local `extern crate` item (otherwise, `extern_crate_id` is None).
752     extern_crate_id: Option<NodeId>,
753
754     resolutions: RefCell<HashMap<(Name, Namespace), &'a RefCell<NameResolution<'a>>>>,
755
756     no_implicit_prelude: Cell<bool>,
757
758     glob_importers: RefCell<Vec<&'a ImportDirective<'a>>>,
759     globs: RefCell<Vec<&'a ImportDirective<'a>>>,
760
761     // Used to memoize the traits in this module for faster searches through all traits in scope.
762     traits: RefCell<Option<Box<[(Name, &'a NameBinding<'a>)]>>>,
763
764     // Whether this module is populated. If not populated, any attempt to
765     // access the children must be preceded with a
766     // `populate_module_if_necessary` call.
767     populated: Cell<bool>,
768
769     arenas: &'a ResolverArenas<'a>,
770 }
771
772 pub type Module<'a> = &'a ModuleS<'a>;
773
774 impl<'a> ModuleS<'a> {
775     fn new(parent_link: ParentLink<'a>,
776            def: Option<Def>,
777            external: bool,
778            arenas: &'a ResolverArenas<'a>) -> Self {
779         ModuleS {
780             parent_link: parent_link,
781             def: def,
782             extern_crate_id: None,
783             resolutions: RefCell::new(HashMap::new()),
784             no_implicit_prelude: Cell::new(false),
785             glob_importers: RefCell::new(Vec::new()),
786             globs: RefCell::new((Vec::new())),
787             traits: RefCell::new(None),
788             populated: Cell::new(!external),
789             arenas: arenas
790         }
791     }
792
793     fn for_each_child<F: FnMut(Name, Namespace, &'a NameBinding<'a>)>(&self, mut f: F) {
794         for (&(name, ns), name_resolution) in self.resolutions.borrow().iter() {
795             name_resolution.borrow().binding.map(|binding| f(name, ns, binding));
796         }
797     }
798
799     fn def_id(&self) -> Option<DefId> {
800         self.def.as_ref().map(Def::def_id)
801     }
802
803     // `self` resolves to the first module ancestor that `is_normal`.
804     fn is_normal(&self) -> bool {
805         match self.def {
806             Some(Def::Mod(_)) => true,
807             _ => false,
808         }
809     }
810
811     fn is_trait(&self) -> bool {
812         match self.def {
813             Some(Def::Trait(_)) => true,
814             _ => false,
815         }
816     }
817 }
818
819 impl<'a> fmt::Debug for ModuleS<'a> {
820     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
821         write!(f, "{:?}", self.def)
822     }
823 }
824
825 // Records a possibly-private value, type, or module definition.
826 #[derive(Clone, Debug)]
827 pub struct NameBinding<'a> {
828     kind: NameBindingKind<'a>,
829     span: Span,
830     vis: ty::Visibility,
831 }
832
833 pub trait ToNameBinding<'a> {
834     fn to_name_binding(self) -> NameBinding<'a>;
835 }
836
837 impl<'a> ToNameBinding<'a> for NameBinding<'a> {
838     fn to_name_binding(self) -> NameBinding<'a> {
839         self
840     }
841 }
842
843 #[derive(Clone, Debug)]
844 enum NameBindingKind<'a> {
845     Def(Def),
846     Module(Module<'a>),
847     Import {
848         binding: &'a NameBinding<'a>,
849         directive: &'a ImportDirective<'a>,
850     },
851 }
852
853 #[derive(Clone, Debug)]
854 struct PrivacyError<'a>(Span, Name, &'a NameBinding<'a>);
855
856 impl<'a> NameBinding<'a> {
857     fn module(&self) -> Option<Module<'a>> {
858         match self.kind {
859             NameBindingKind::Module(module) => Some(module),
860             NameBindingKind::Def(_) => None,
861             NameBindingKind::Import { binding, .. } => binding.module(),
862         }
863     }
864
865     fn def(&self) -> Option<Def> {
866         match self.kind {
867             NameBindingKind::Def(def) => Some(def),
868             NameBindingKind::Module(module) => module.def,
869             NameBindingKind::Import { binding, .. } => binding.def(),
870         }
871     }
872
873     fn is_pseudo_public(&self) -> bool {
874         self.pseudo_vis() == ty::Visibility::Public
875     }
876
877     // We sometimes need to treat variants as `pub` for backwards compatibility
878     fn pseudo_vis(&self) -> ty::Visibility {
879         if self.is_variant() { ty::Visibility::Public } else { self.vis }
880     }
881
882     fn is_variant(&self) -> bool {
883         match self.kind {
884             NameBindingKind::Def(Def::Variant(..)) => true,
885             _ => false,
886         }
887     }
888
889     fn is_extern_crate(&self) -> bool {
890         self.module().and_then(|module| module.extern_crate_id).is_some()
891     }
892
893     fn is_import(&self) -> bool {
894         match self.kind {
895             NameBindingKind::Import { .. } => true,
896             _ => false,
897         }
898     }
899
900     fn is_glob_import(&self) -> bool {
901         match self.kind {
902             NameBindingKind::Import { directive, .. } => directive.is_glob(),
903             _ => false,
904         }
905     }
906
907     fn is_importable(&self) -> bool {
908         match self.def().unwrap() {
909             Def::AssociatedConst(..) | Def::Method(..) | Def::AssociatedTy(..) => false,
910             _ => true,
911         }
912     }
913 }
914
915 /// Interns the names of the primitive types.
916 struct PrimitiveTypeTable {
917     primitive_types: HashMap<Name, PrimTy>,
918 }
919
920 impl PrimitiveTypeTable {
921     fn new() -> PrimitiveTypeTable {
922         let mut table = PrimitiveTypeTable { primitive_types: HashMap::new() };
923
924         table.intern("bool", TyBool);
925         table.intern("char", TyChar);
926         table.intern("f32", TyFloat(FloatTy::F32));
927         table.intern("f64", TyFloat(FloatTy::F64));
928         table.intern("isize", TyInt(IntTy::Is));
929         table.intern("i8", TyInt(IntTy::I8));
930         table.intern("i16", TyInt(IntTy::I16));
931         table.intern("i32", TyInt(IntTy::I32));
932         table.intern("i64", TyInt(IntTy::I64));
933         table.intern("str", TyStr);
934         table.intern("usize", TyUint(UintTy::Us));
935         table.intern("u8", TyUint(UintTy::U8));
936         table.intern("u16", TyUint(UintTy::U16));
937         table.intern("u32", TyUint(UintTy::U32));
938         table.intern("u64", TyUint(UintTy::U64));
939
940         table
941     }
942
943     fn intern(&mut self, string: &str, primitive_type: PrimTy) {
944         self.primitive_types.insert(token::intern(string), primitive_type);
945     }
946 }
947
948 /// The main resolver class.
949 pub struct Resolver<'a> {
950     session: &'a Session,
951
952     pub definitions: Definitions,
953
954     // Maps the node id of a statement to the expansions of the `macro_rules!`s
955     // immediately above the statement (if appropriate).
956     macros_at_scope: HashMap<NodeId, Vec<Mark>>,
957
958     graph_root: Module<'a>,
959
960     prelude: Option<Module<'a>>,
961
962     trait_item_map: FnvHashMap<(Name, DefId), bool /* is static method? */>,
963
964     structs: FnvHashMap<DefId, Vec<Name>>,
965
966     // All indeterminate imports (i.e. imports not known to succeed or fail).
967     indeterminate_imports: Vec<&'a ImportDirective<'a>>,
968
969     // The module that represents the current item scope.
970     current_module: Module<'a>,
971
972     // The current set of local scopes, for values.
973     // FIXME #4948: Reuse ribs to avoid allocation.
974     value_ribs: Vec<Rib<'a>>,
975
976     // The current set of local scopes, for types.
977     type_ribs: Vec<Rib<'a>>,
978
979     // The current set of local scopes, for labels.
980     label_ribs: Vec<Rib<'a>>,
981
982     // The trait that the current context can refer to.
983     current_trait_ref: Option<(DefId, TraitRef)>,
984
985     // The current self type if inside an impl (used for better errors).
986     current_self_type: Option<Ty>,
987
988     // The idents for the primitive types.
989     primitive_type_table: PrimitiveTypeTable,
990
991     pub def_map: DefMap,
992     pub freevars: FreevarMap,
993     freevars_seen: NodeMap<NodeMap<usize>>,
994     pub export_map: ExportMap,
995     pub trait_map: TraitMap,
996
997     // A map from nodes to modules, both normal (`mod`) modules and anonymous modules.
998     // Anonymous modules are pseudo-modules that are implicitly created around items
999     // contained within blocks.
1000     //
1001     // For example, if we have this:
1002     //
1003     //  fn f() {
1004     //      fn g() {
1005     //          ...
1006     //      }
1007     //  }
1008     //
1009     // There will be an anonymous module created around `g` with the ID of the
1010     // entry block for `f`.
1011     module_map: NodeMap<Module<'a>>,
1012
1013     // Whether or not to print error messages. Can be set to true
1014     // when getting additional info for error message suggestions,
1015     // so as to avoid printing duplicate errors
1016     emit_errors: bool,
1017
1018     pub make_glob_map: bool,
1019     // Maps imports to the names of items actually imported (this actually maps
1020     // all imports, but only glob imports are actually interesting).
1021     pub glob_map: GlobMap,
1022
1023     used_imports: HashSet<(NodeId, Namespace)>,
1024     used_crates: HashSet<CrateNum>,
1025     pub maybe_unused_trait_imports: NodeSet,
1026
1027     privacy_errors: Vec<PrivacyError<'a>>,
1028
1029     arenas: &'a ResolverArenas<'a>,
1030 }
1031
1032 pub struct ResolverArenas<'a> {
1033     modules: arena::TypedArena<ModuleS<'a>>,
1034     local_modules: RefCell<Vec<Module<'a>>>,
1035     name_bindings: arena::TypedArena<NameBinding<'a>>,
1036     import_directives: arena::TypedArena<ImportDirective<'a>>,
1037     name_resolutions: arena::TypedArena<RefCell<NameResolution<'a>>>,
1038 }
1039
1040 impl<'a> ResolverArenas<'a> {
1041     fn alloc_module(&'a self, module: ModuleS<'a>) -> Module<'a> {
1042         let module = self.modules.alloc(module);
1043         if module.def_id().map(|def_id| def_id.is_local()).unwrap_or(true) {
1044             self.local_modules.borrow_mut().push(module);
1045         }
1046         module
1047     }
1048     fn local_modules(&'a self) -> ::std::cell::Ref<'a, Vec<Module<'a>>> {
1049         self.local_modules.borrow()
1050     }
1051     fn alloc_name_binding(&'a self, name_binding: NameBinding<'a>) -> &'a NameBinding<'a> {
1052         self.name_bindings.alloc(name_binding)
1053     }
1054     fn alloc_import_directive(&'a self, import_directive: ImportDirective<'a>)
1055                               -> &'a ImportDirective {
1056         self.import_directives.alloc(import_directive)
1057     }
1058     fn alloc_name_resolution(&'a self) -> &'a RefCell<NameResolution<'a>> {
1059         self.name_resolutions.alloc(Default::default())
1060     }
1061 }
1062
1063 impl<'a> ty::NodeIdTree for Resolver<'a> {
1064     fn is_descendant_of(&self, node: NodeId, ancestor: NodeId) -> bool {
1065         let ancestor = self.definitions.local_def_id(ancestor);
1066         let mut module = *self.module_map.get(&node).unwrap();
1067         while module.def_id() != Some(ancestor) {
1068             let module_parent = match self.get_nearest_normal_module_parent(module) {
1069                 Some(parent) => parent,
1070                 None => return false,
1071             };
1072             module = module_parent;
1073         }
1074         true
1075     }
1076 }
1077
1078 impl<'a> hir::lowering::Resolver for Resolver<'a> {
1079     fn resolve_generated_global_path(&mut self, path: &hir::Path, is_value: bool) -> Def {
1080         let namespace = if is_value { ValueNS } else { TypeNS };
1081         match self.resolve_crate_relative_path(path.span, &path.segments, namespace) {
1082             Ok(binding) => binding.def().unwrap(),
1083             Err(true) => Def::Err,
1084             Err(false) => {
1085                 let path_name = &format!("{}", path);
1086                 let error =
1087                     ResolutionError::UnresolvedName {
1088                         path: path_name,
1089                         message: "",
1090                         context: UnresolvedNameContext::Other,
1091                         is_static_method: false,
1092                         is_field: false,
1093                         def: Def::Err,
1094                     };
1095                 resolve_error(self, path.span, error);
1096                 Def::Err
1097             }
1098         }
1099     }
1100
1101     fn get_resolution(&mut self, id: NodeId) -> Option<PathResolution> {
1102         self.def_map.get(&id).cloned()
1103     }
1104
1105     fn record_resolution(&mut self, id: NodeId, def: Def) {
1106         self.def_map.insert(id, PathResolution::new(def));
1107     }
1108
1109     fn definitions(&mut self) -> Option<&mut Definitions> {
1110         Some(&mut self.definitions)
1111     }
1112 }
1113
1114 trait Named {
1115     fn name(&self) -> Name;
1116 }
1117
1118 impl Named for ast::PathSegment {
1119     fn name(&self) -> Name {
1120         self.identifier.name
1121     }
1122 }
1123
1124 impl Named for hir::PathSegment {
1125     fn name(&self) -> Name {
1126         self.name
1127     }
1128 }
1129
1130 impl<'a> Resolver<'a> {
1131     pub fn new(session: &'a Session, make_glob_map: MakeGlobMap, arenas: &'a ResolverArenas<'a>)
1132                -> Resolver<'a> {
1133         let root_def_id = DefId::local(CRATE_DEF_INDEX);
1134         let graph_root =
1135             ModuleS::new(NoParentLink, Some(Def::Mod(root_def_id)), false, arenas);
1136         let graph_root = arenas.alloc_module(graph_root);
1137         let mut module_map = NodeMap();
1138         module_map.insert(CRATE_NODE_ID, graph_root);
1139
1140         Resolver {
1141             session: session,
1142
1143             definitions: Definitions::new(),
1144             macros_at_scope: HashMap::new(),
1145
1146             // The outermost module has def ID 0; this is not reflected in the
1147             // AST.
1148             graph_root: graph_root,
1149             prelude: None,
1150
1151             trait_item_map: FnvHashMap(),
1152             structs: FnvHashMap(),
1153
1154             indeterminate_imports: Vec::new(),
1155
1156             current_module: graph_root,
1157             value_ribs: vec![Rib::new(ModuleRibKind(graph_root))],
1158             type_ribs: vec![Rib::new(ModuleRibKind(graph_root))],
1159             label_ribs: Vec::new(),
1160
1161             current_trait_ref: None,
1162             current_self_type: None,
1163
1164             primitive_type_table: PrimitiveTypeTable::new(),
1165
1166             def_map: NodeMap(),
1167             freevars: NodeMap(),
1168             freevars_seen: NodeMap(),
1169             export_map: NodeMap(),
1170             trait_map: NodeMap(),
1171             module_map: module_map,
1172
1173             emit_errors: true,
1174             make_glob_map: make_glob_map == MakeGlobMap::Yes,
1175             glob_map: NodeMap(),
1176
1177             used_imports: HashSet::new(),
1178             used_crates: HashSet::new(),
1179             maybe_unused_trait_imports: NodeSet(),
1180
1181             privacy_errors: Vec::new(),
1182
1183             arenas: arenas,
1184         }
1185     }
1186
1187     pub fn arenas() -> ResolverArenas<'a> {
1188         ResolverArenas {
1189             modules: arena::TypedArena::new(),
1190             local_modules: RefCell::new(Vec::new()),
1191             name_bindings: arena::TypedArena::new(),
1192             import_directives: arena::TypedArena::new(),
1193             name_resolutions: arena::TypedArena::new(),
1194         }
1195     }
1196
1197     /// Entry point to crate resolution.
1198     pub fn resolve_crate(&mut self, krate: &Crate) {
1199         self.current_module = self.graph_root;
1200         visit::walk_crate(self, krate);
1201
1202         check_unused::check_crate(self, krate);
1203         self.report_privacy_errors();
1204     }
1205
1206     fn new_module(&self, parent_link: ParentLink<'a>, def: Option<Def>, external: bool)
1207                   -> Module<'a> {
1208         self.arenas.alloc_module(ModuleS::new(parent_link, def, external, self.arenas))
1209     }
1210
1211     fn new_extern_crate_module(&self, parent_link: ParentLink<'a>, def: Def, local_node_id: NodeId)
1212                                -> Module<'a> {
1213         let mut module = ModuleS::new(parent_link, Some(def), false, self.arenas);
1214         module.extern_crate_id = Some(local_node_id);
1215         self.arenas.modules.alloc(module)
1216     }
1217
1218     fn get_ribs<'b>(&'b mut self, ns: Namespace) -> &'b mut Vec<Rib<'a>> {
1219         match ns { ValueNS => &mut self.value_ribs, TypeNS => &mut self.type_ribs }
1220     }
1221
1222     fn record_use(&mut self, name: Name, ns: Namespace, binding: &'a NameBinding<'a>) {
1223         // track extern crates for unused_extern_crate lint
1224         if let Some(DefId { krate, .. }) = binding.module().and_then(ModuleS::def_id) {
1225             self.used_crates.insert(krate);
1226         }
1227
1228         if let NameBindingKind::Import { directive, .. } = binding.kind {
1229             self.used_imports.insert((directive.id, ns));
1230             self.add_to_glob_map(directive.id, name);
1231         }
1232     }
1233
1234     fn add_to_glob_map(&mut self, id: NodeId, name: Name) {
1235         if self.make_glob_map {
1236             self.glob_map.entry(id).or_insert_with(FnvHashSet).insert(name);
1237         }
1238     }
1239
1240     /// Resolves the given module path from the given root `search_module`.
1241     fn resolve_module_path_from_root(&mut self,
1242                                      mut search_module: Module<'a>,
1243                                      module_path: &[Name],
1244                                      index: usize,
1245                                      span: Span)
1246                                      -> ResolveResult<Module<'a>> {
1247         fn search_parent_externals(needle: Name, module: Module) -> Option<Module> {
1248             match module.resolve_name(needle, TypeNS, false) {
1249                 Success(binding) if binding.is_extern_crate() => Some(module),
1250                 _ => match module.parent_link {
1251                     ModuleParentLink(ref parent, _) => {
1252                         search_parent_externals(needle, parent)
1253                     }
1254                     _ => None,
1255                 },
1256             }
1257         }
1258
1259         let mut index = index;
1260         let module_path_len = module_path.len();
1261
1262         // Resolve the module part of the path. This does not involve looking
1263         // upward though scope chains; we simply resolve names directly in
1264         // modules as we go.
1265         while index < module_path_len {
1266             let name = module_path[index];
1267             match self.resolve_name_in_module(search_module, name, TypeNS, false, true) {
1268                 Failed(None) => {
1269                     let segment_name = name.as_str();
1270                     let module_name = module_to_string(search_module);
1271                     let msg = if "???" == &module_name {
1272                         match search_parent_externals(name, &self.current_module) {
1273                             Some(module) => {
1274                                 let path_str = names_to_string(module_path);
1275                                 let target_mod_str = module_to_string(&module);
1276                                 let current_mod_str = module_to_string(&self.current_module);
1277
1278                                 let prefix = if target_mod_str == current_mod_str {
1279                                     "self::".to_string()
1280                                 } else {
1281                                     format!("{}::", target_mod_str)
1282                                 };
1283
1284                                 format!("Did you mean `{}{}`?", prefix, path_str)
1285                             }
1286                             None => format!("Maybe a missing `extern crate {}`?", segment_name),
1287                         }
1288                     } else {
1289                         format!("Could not find `{}` in `{}`", segment_name, module_name)
1290                     };
1291
1292                     return Failed(Some((span, msg)));
1293                 }
1294                 Failed(err) => return Failed(err),
1295                 Indeterminate => {
1296                     debug!("(resolving module path for import) module resolution is \
1297                             indeterminate: {}",
1298                            name);
1299                     return Indeterminate;
1300                 }
1301                 Success(binding) => {
1302                     // Check to see whether there are type bindings, and, if
1303                     // so, whether there is a module within.
1304                     if let Some(module_def) = binding.module() {
1305                         self.check_privacy(name, binding, span);
1306                         search_module = module_def;
1307                     } else {
1308                         let msg = format!("Not a module `{}`", name);
1309                         return Failed(Some((span, msg)));
1310                     }
1311                 }
1312             }
1313
1314             index += 1;
1315         }
1316
1317         return Success(search_module);
1318     }
1319
1320     /// Attempts to resolve the module part of an import directive or path
1321     /// rooted at the given module.
1322     fn resolve_module_path(&mut self,
1323                            module_path: &[Name],
1324                            use_lexical_scope: UseLexicalScopeFlag,
1325                            span: Span)
1326                            -> ResolveResult<Module<'a>> {
1327         if module_path.len() == 0 {
1328             return Success(self.graph_root) // Use the crate root
1329         }
1330
1331         debug!("(resolving module path for import) processing `{}` rooted at `{}`",
1332                names_to_string(module_path),
1333                module_to_string(self.current_module));
1334
1335         // Resolve the module prefix, if any.
1336         let module_prefix_result = self.resolve_module_prefix(module_path, span);
1337
1338         let search_module;
1339         let start_index;
1340         match module_prefix_result {
1341             Failed(err) => return Failed(err),
1342             Indeterminate => {
1343                 debug!("(resolving module path for import) indeterminate; bailing");
1344                 return Indeterminate;
1345             }
1346             Success(NoPrefixFound) => {
1347                 // There was no prefix, so we're considering the first element
1348                 // of the path. How we handle this depends on whether we were
1349                 // instructed to use lexical scope or not.
1350                 match use_lexical_scope {
1351                     DontUseLexicalScope => {
1352                         // This is a crate-relative path. We will start the
1353                         // resolution process at index zero.
1354                         search_module = self.graph_root;
1355                         start_index = 0;
1356                     }
1357                     UseLexicalScope => {
1358                         // This is not a crate-relative path. We resolve the
1359                         // first component of the path in the current lexical
1360                         // scope and then proceed to resolve below that.
1361                         let ident = ast::Ident::with_empty_ctxt(module_path[0]);
1362                         match self.resolve_ident_in_lexical_scope(ident, TypeNS, true)
1363                                   .and_then(LexicalScopeBinding::module) {
1364                             None => return Failed(None),
1365                             Some(containing_module) => {
1366                                 search_module = containing_module;
1367                                 start_index = 1;
1368                             }
1369                         }
1370                     }
1371                 }
1372             }
1373             Success(PrefixFound(ref containing_module, index)) => {
1374                 search_module = containing_module;
1375                 start_index = index;
1376             }
1377         }
1378
1379         self.resolve_module_path_from_root(search_module,
1380                                            module_path,
1381                                            start_index,
1382                                            span)
1383     }
1384
1385     /// This resolves the identifier `ident` in the namespace `ns` in the current lexical scope.
1386     /// More specifically, we proceed up the hierarchy of scopes and return the binding for
1387     /// `ident` in the first scope that defines it (or None if no scopes define it).
1388     ///
1389     /// A block's items are above its local variables in the scope hierarchy, regardless of where
1390     /// the items are defined in the block. For example,
1391     /// ```rust
1392     /// fn f() {
1393     ///    g(); // Since there are no local variables in scope yet, this resolves to the item.
1394     ///    let g = || {};
1395     ///    fn g() {}
1396     ///    g(); // This resolves to the local variable `g` since it shadows the item.
1397     /// }
1398     /// ```
1399     ///
1400     /// Invariant: This must only be called during main resolution, not during
1401     /// import resolution.
1402     fn resolve_ident_in_lexical_scope(&mut self,
1403                                       mut ident: ast::Ident,
1404                                       ns: Namespace,
1405                                       record_used: bool)
1406                                       -> Option<LexicalScopeBinding<'a>> {
1407         if ns == TypeNS {
1408             ident = ast::Ident::with_empty_ctxt(ident.name);
1409         }
1410
1411         // Walk backwards up the ribs in scope.
1412         for i in (0 .. self.get_ribs(ns).len()).rev() {
1413             if let Some(def) = self.get_ribs(ns)[i].bindings.get(&ident).cloned() {
1414                 // The ident resolves to a type parameter or local variable.
1415                 return Some(LexicalScopeBinding::LocalDef(LocalDef {
1416                     ribs: Some((ns, i)),
1417                     def: def,
1418                 }));
1419             }
1420
1421             if let ModuleRibKind(module) = self.get_ribs(ns)[i].kind {
1422                 let name = ident.name;
1423                 let item = self.resolve_name_in_module(module, name, ns, true, record_used);
1424                 if let Success(binding) = item {
1425                     // The ident resolves to an item.
1426                     return Some(LexicalScopeBinding::Item(binding));
1427                 }
1428
1429                 // We can only see through anonymous modules
1430                 if module.def.is_some() {
1431                     return match self.prelude {
1432                         Some(prelude) if !module.no_implicit_prelude.get() => {
1433                             prelude.resolve_name(name, ns, false).success()
1434                                    .map(LexicalScopeBinding::Item)
1435                         }
1436                         _ => None,
1437                     };
1438                 }
1439             }
1440
1441             if let MacroDefinition(mac) = self.get_ribs(ns)[i].kind {
1442                 // If an invocation of this macro created `ident`, give up on `ident`
1443                 // and switch to `ident`'s source from the macro definition.
1444                 let (source_ctxt, source_macro) = ident.ctxt.source();
1445                 if source_macro == mac {
1446                     ident.ctxt = source_ctxt;
1447                 }
1448             }
1449         }
1450
1451         None
1452     }
1453
1454     /// Returns the nearest normal module parent of the given module.
1455     fn get_nearest_normal_module_parent(&self, mut module: Module<'a>) -> Option<Module<'a>> {
1456         loop {
1457             match module.parent_link {
1458                 NoParentLink => return None,
1459                 ModuleParentLink(new_module, _) |
1460                 BlockParentLink(new_module, _) => {
1461                     let new_module = new_module;
1462                     if new_module.is_normal() {
1463                         return Some(new_module);
1464                     }
1465                     module = new_module;
1466                 }
1467             }
1468         }
1469     }
1470
1471     /// Returns the nearest normal module parent of the given module, or the
1472     /// module itself if it is a normal module.
1473     fn get_nearest_normal_module_parent_or_self(&self, module: Module<'a>) -> Module<'a> {
1474         if module.is_normal() {
1475             return module;
1476         }
1477         match self.get_nearest_normal_module_parent(module) {
1478             None => module,
1479             Some(new_module) => new_module,
1480         }
1481     }
1482
1483     /// Resolves a "module prefix". A module prefix is one or both of (a) `self::`;
1484     /// (b) some chain of `super::`.
1485     /// grammar: (SELF MOD_SEP ) ? (SUPER MOD_SEP) *
1486     fn resolve_module_prefix(&mut self, module_path: &[Name], span: Span)
1487                              -> ResolveResult<ModulePrefixResult<'a>> {
1488         // Start at the current module if we see `self` or `super`, or at the
1489         // top of the crate otherwise.
1490         let mut i = match &*module_path[0].as_str() {
1491             "self" => 1,
1492             "super" => 0,
1493             _ => return Success(NoPrefixFound),
1494         };
1495         let mut containing_module =
1496             self.get_nearest_normal_module_parent_or_self(self.current_module);
1497
1498         // Now loop through all the `super`s we find.
1499         while i < module_path.len() && "super" == module_path[i].as_str() {
1500             debug!("(resolving module prefix) resolving `super` at {}",
1501                    module_to_string(&containing_module));
1502             match self.get_nearest_normal_module_parent(containing_module) {
1503                 None => {
1504                     let msg = "There are too many initial `super`s.".into();
1505                     return Failed(Some((span, msg)));
1506                 }
1507                 Some(new_module) => {
1508                     containing_module = new_module;
1509                     i += 1;
1510                 }
1511             }
1512         }
1513
1514         debug!("(resolving module prefix) finished resolving prefix at {}",
1515                module_to_string(&containing_module));
1516
1517         return Success(PrefixFound(containing_module, i));
1518     }
1519
1520     /// Attempts to resolve the supplied name in the given module for the
1521     /// given namespace. If successful, returns the binding corresponding to
1522     /// the name.
1523     fn resolve_name_in_module(&mut self,
1524                               module: Module<'a>,
1525                               name: Name,
1526                               namespace: Namespace,
1527                               use_lexical_scope: bool,
1528                               record_used: bool)
1529                               -> ResolveResult<&'a NameBinding<'a>> {
1530         debug!("(resolving name in module) resolving `{}` in `{}`", name, module_to_string(module));
1531
1532         self.populate_module_if_necessary(module);
1533         module.resolve_name(name, namespace, use_lexical_scope).and_then(|binding| {
1534             if record_used {
1535                 self.record_use(name, namespace, binding);
1536             }
1537             Success(binding)
1538         })
1539     }
1540
1541     // AST resolution
1542     //
1543     // We maintain a list of value ribs and type ribs.
1544     //
1545     // Simultaneously, we keep track of the current position in the module
1546     // graph in the `current_module` pointer. When we go to resolve a name in
1547     // the value or type namespaces, we first look through all the ribs and
1548     // then query the module graph. When we resolve a name in the module
1549     // namespace, we can skip all the ribs (since nested modules are not
1550     // allowed within blocks in Rust) and jump straight to the current module
1551     // graph node.
1552     //
1553     // Named implementations are handled separately. When we find a method
1554     // call, we consult the module node to find all of the implementations in
1555     // scope. This information is lazily cached in the module node. We then
1556     // generate a fake "implementation scope" containing all the
1557     // implementations thus found, for compatibility with old resolve pass.
1558
1559     fn with_scope<F>(&mut self, id: NodeId, f: F)
1560         where F: FnOnce(&mut Resolver)
1561     {
1562         let module = self.module_map.get(&id).cloned(); // clones a reference
1563         if let Some(module) = module {
1564             // Move down in the graph.
1565             let orig_module = ::std::mem::replace(&mut self.current_module, module);
1566             self.value_ribs.push(Rib::new(ModuleRibKind(module)));
1567             self.type_ribs.push(Rib::new(ModuleRibKind(module)));
1568
1569             f(self);
1570
1571             self.current_module = orig_module;
1572             self.value_ribs.pop();
1573             self.type_ribs.pop();
1574         } else {
1575             f(self);
1576         }
1577     }
1578
1579     /// Searches the current set of local scopes for labels.
1580     /// Stops after meeting a closure.
1581     fn search_label(&self, mut ident: ast::Ident) -> Option<Def> {
1582         for rib in self.label_ribs.iter().rev() {
1583             match rib.kind {
1584                 NormalRibKind => {
1585                     // Continue
1586                 }
1587                 MacroDefinition(mac) => {
1588                     // If an invocation of this macro created `ident`, give up on `ident`
1589                     // and switch to `ident`'s source from the macro definition.
1590                     let (source_ctxt, source_macro) = ident.ctxt.source();
1591                     if source_macro == mac {
1592                         ident.ctxt = source_ctxt;
1593                     }
1594                 }
1595                 _ => {
1596                     // Do not resolve labels across function boundary
1597                     return None;
1598                 }
1599             }
1600             let result = rib.bindings.get(&ident).cloned();
1601             if result.is_some() {
1602                 return result;
1603             }
1604         }
1605         None
1606     }
1607
1608     fn resolve_item(&mut self, item: &Item) {
1609         let name = item.ident.name;
1610
1611         debug!("(resolving item) resolving {}", name);
1612
1613         match item.node {
1614             ItemKind::Enum(_, ref generics) |
1615             ItemKind::Ty(_, ref generics) |
1616             ItemKind::Struct(_, ref generics) |
1617             ItemKind::Fn(_, _, _, _, ref generics, _) => {
1618                 self.with_type_parameter_rib(HasTypeParameters(generics, ItemRibKind),
1619                                              |this| visit::walk_item(this, item));
1620             }
1621
1622             ItemKind::DefaultImpl(_, ref trait_ref) => {
1623                 self.with_optional_trait_ref(Some(trait_ref), |_, _| {});
1624             }
1625             ItemKind::Impl(_, _, ref generics, ref opt_trait_ref, ref self_type, ref impl_items) =>
1626                 self.resolve_implementation(generics,
1627                                             opt_trait_ref,
1628                                             &self_type,
1629                                             item.id,
1630                                             impl_items),
1631
1632             ItemKind::Trait(_, ref generics, ref bounds, ref trait_items) => {
1633                 // Create a new rib for the trait-wide type parameters.
1634                 self.with_type_parameter_rib(HasTypeParameters(generics, ItemRibKind), |this| {
1635                     let local_def_id = this.definitions.local_def_id(item.id);
1636                     this.with_self_rib(Def::SelfTy(Some(local_def_id), None), |this| {
1637                         this.visit_generics(generics);
1638                         walk_list!(this, visit_ty_param_bound, bounds);
1639
1640                         for trait_item in trait_items {
1641                             match trait_item.node {
1642                                 TraitItemKind::Const(_, ref default) => {
1643                                     // Only impose the restrictions of
1644                                     // ConstRibKind if there's an actual constant
1645                                     // expression in a provided default.
1646                                     if default.is_some() {
1647                                         this.with_constant_rib(|this| {
1648                                             visit::walk_trait_item(this, trait_item)
1649                                         });
1650                                     } else {
1651                                         visit::walk_trait_item(this, trait_item)
1652                                     }
1653                                 }
1654                                 TraitItemKind::Method(ref sig, _) => {
1655                                     let type_parameters =
1656                                         HasTypeParameters(&sig.generics,
1657                                                           MethodRibKind(!sig.decl.has_self()));
1658                                     this.with_type_parameter_rib(type_parameters, |this| {
1659                                         visit::walk_trait_item(this, trait_item)
1660                                     });
1661                                 }
1662                                 TraitItemKind::Type(..) => {
1663                                     this.with_type_parameter_rib(NoTypeParameters, |this| {
1664                                         visit::walk_trait_item(this, trait_item)
1665                                     });
1666                                 }
1667                                 TraitItemKind::Macro(_) => panic!("unexpanded macro in resolve!"),
1668                             };
1669                         }
1670                     });
1671                 });
1672             }
1673
1674             ItemKind::Mod(_) | ItemKind::ForeignMod(_) => {
1675                 self.with_scope(item.id, |this| {
1676                     visit::walk_item(this, item);
1677                 });
1678             }
1679
1680             ItemKind::Const(..) | ItemKind::Static(..) => {
1681                 self.with_constant_rib(|this| {
1682                     visit::walk_item(this, item);
1683                 });
1684             }
1685
1686             ItemKind::Use(ref view_path) => {
1687                 match view_path.node {
1688                     ast::ViewPathList(ref prefix, ref items) => {
1689                         // Resolve prefix of an import with empty braces (issue #28388)
1690                         if items.is_empty() && !prefix.segments.is_empty() {
1691                             match self.resolve_crate_relative_path(prefix.span,
1692                                                                    &prefix.segments,
1693                                                                    TypeNS) {
1694                                 Ok(binding) => {
1695                                     let def = binding.def().unwrap();
1696                                     self.record_def(item.id, PathResolution::new(def));
1697                                 }
1698                                 Err(true) => self.record_def(item.id, err_path_resolution()),
1699                                 Err(false) => {
1700                                     resolve_error(self,
1701                                                   prefix.span,
1702                                                   ResolutionError::FailedToResolve(
1703                                                       &path_names_to_string(prefix, 0)));
1704                                     self.record_def(item.id, err_path_resolution());
1705                                 }
1706                             }
1707                         }
1708                     }
1709                     _ => {}
1710                 }
1711             }
1712
1713             ItemKind::ExternCrate(_) => {
1714                 // do nothing, these are just around to be encoded
1715             }
1716
1717             ItemKind::Mac(_) => panic!("unexpanded macro in resolve!"),
1718         }
1719     }
1720
1721     fn with_type_parameter_rib<'b, F>(&'b mut self, type_parameters: TypeParameters<'a, 'b>, f: F)
1722         where F: FnOnce(&mut Resolver)
1723     {
1724         match type_parameters {
1725             HasTypeParameters(generics, rib_kind) => {
1726                 let mut function_type_rib = Rib::new(rib_kind);
1727                 let mut seen_bindings = HashSet::new();
1728                 for type_parameter in &generics.ty_params {
1729                     let name = type_parameter.ident.name;
1730                     debug!("with_type_parameter_rib: {}", type_parameter.id);
1731
1732                     if seen_bindings.contains(&name) {
1733                         resolve_error(self,
1734                                       type_parameter.span,
1735                                       ResolutionError::NameAlreadyUsedInTypeParameterList(name));
1736                     }
1737                     seen_bindings.insert(name);
1738
1739                     // plain insert (no renaming)
1740                     let def_id = self.definitions.local_def_id(type_parameter.id);
1741                     let def = Def::TyParam(def_id);
1742                     function_type_rib.bindings.insert(ast::Ident::with_empty_ctxt(name), def);
1743                     self.record_def(type_parameter.id, PathResolution::new(def));
1744                 }
1745                 self.type_ribs.push(function_type_rib);
1746             }
1747
1748             NoTypeParameters => {
1749                 // Nothing to do.
1750             }
1751         }
1752
1753         f(self);
1754
1755         if let HasTypeParameters(..) = type_parameters {
1756             self.type_ribs.pop();
1757         }
1758     }
1759
1760     fn with_label_rib<F>(&mut self, f: F)
1761         where F: FnOnce(&mut Resolver)
1762     {
1763         self.label_ribs.push(Rib::new(NormalRibKind));
1764         f(self);
1765         self.label_ribs.pop();
1766     }
1767
1768     fn with_constant_rib<F>(&mut self, f: F)
1769         where F: FnOnce(&mut Resolver)
1770     {
1771         self.value_ribs.push(Rib::new(ConstantItemRibKind));
1772         self.type_ribs.push(Rib::new(ConstantItemRibKind));
1773         f(self);
1774         self.type_ribs.pop();
1775         self.value_ribs.pop();
1776     }
1777
1778     fn resolve_function(&mut self,
1779                         rib_kind: RibKind<'a>,
1780                         declaration: &FnDecl,
1781                         block: &Block) {
1782         // Create a value rib for the function.
1783         self.value_ribs.push(Rib::new(rib_kind));
1784
1785         // Create a label rib for the function.
1786         self.label_ribs.push(Rib::new(rib_kind));
1787
1788         // Add each argument to the rib.
1789         let mut bindings_list = HashMap::new();
1790         for argument in &declaration.inputs {
1791             self.resolve_pattern(&argument.pat, PatternSource::FnParam, &mut bindings_list);
1792
1793             self.visit_ty(&argument.ty);
1794
1795             debug!("(resolving function) recorded argument");
1796         }
1797         visit::walk_fn_ret_ty(self, &declaration.output);
1798
1799         // Resolve the function body.
1800         self.visit_block(block);
1801
1802         debug!("(resolving function) leaving function");
1803
1804         self.label_ribs.pop();
1805         self.value_ribs.pop();
1806     }
1807
1808     fn resolve_trait_reference(&mut self,
1809                                id: NodeId,
1810                                trait_path: &Path,
1811                                path_depth: usize)
1812                                -> Result<PathResolution, ()> {
1813         self.resolve_path(id, trait_path, path_depth, TypeNS).and_then(|path_res| {
1814             match path_res.base_def {
1815                 Def::Trait(_) => {
1816                     debug!("(resolving trait) found trait def: {:?}", path_res);
1817                     return Ok(path_res);
1818                 }
1819                 Def::Err => return Err(true),
1820                 _ => {}
1821             }
1822
1823             let mut err = resolve_struct_error(self, trait_path.span, {
1824                 ResolutionError::IsNotATrait(&path_names_to_string(trait_path, path_depth))
1825             });
1826
1827             // If it's a typedef, give a note
1828             if let Def::TyAlias(..) = path_res.base_def {
1829                 err.note(&format!("type aliases cannot be used for traits"));
1830             }
1831             err.emit();
1832             Err(true)
1833         }).map_err(|error_reported| {
1834             if error_reported { return }
1835
1836             // find possible candidates
1837             let trait_name = trait_path.segments.last().unwrap().identifier.name;
1838             let candidates =
1839                 self.lookup_candidates(
1840                     trait_name,
1841                     TypeNS,
1842                     |def| match def {
1843                         Def::Trait(_) => true,
1844                         _             => false,
1845                     },
1846                 );
1847
1848             // create error object
1849             let name = &path_names_to_string(trait_path, path_depth);
1850             let error =
1851                 ResolutionError::UndeclaredTraitName(
1852                     name,
1853                     candidates,
1854                 );
1855
1856             resolve_error(self, trait_path.span, error);
1857         })
1858     }
1859
1860     fn with_current_self_type<T, F>(&mut self, self_type: &Ty, f: F) -> T
1861         where F: FnOnce(&mut Resolver) -> T
1862     {
1863         // Handle nested impls (inside fn bodies)
1864         let previous_value = replace(&mut self.current_self_type, Some(self_type.clone()));
1865         let result = f(self);
1866         self.current_self_type = previous_value;
1867         result
1868     }
1869
1870     fn with_optional_trait_ref<T, F>(&mut self, opt_trait_ref: Option<&TraitRef>, f: F) -> T
1871         where F: FnOnce(&mut Resolver, Option<DefId>) -> T
1872     {
1873         let mut new_val = None;
1874         let mut new_id = None;
1875         if let Some(trait_ref) = opt_trait_ref {
1876             if let Ok(path_res) = self.resolve_trait_reference(trait_ref.ref_id,
1877                                                                &trait_ref.path,
1878                                                                0) {
1879                 assert!(path_res.depth == 0);
1880                 self.record_def(trait_ref.ref_id, path_res);
1881                 new_val = Some((path_res.base_def.def_id(), trait_ref.clone()));
1882                 new_id = Some(path_res.base_def.def_id());
1883             } else {
1884                 self.record_def(trait_ref.ref_id, err_path_resolution());
1885             }
1886             visit::walk_trait_ref(self, trait_ref);
1887         }
1888         let original_trait_ref = replace(&mut self.current_trait_ref, new_val);
1889         let result = f(self, new_id);
1890         self.current_trait_ref = original_trait_ref;
1891         result
1892     }
1893
1894     fn with_self_rib<F>(&mut self, self_def: Def, f: F)
1895         where F: FnOnce(&mut Resolver)
1896     {
1897         let mut self_type_rib = Rib::new(NormalRibKind);
1898
1899         // plain insert (no renaming, types are not currently hygienic....)
1900         self_type_rib.bindings.insert(keywords::SelfType.ident(), self_def);
1901         self.type_ribs.push(self_type_rib);
1902         f(self);
1903         self.type_ribs.pop();
1904     }
1905
1906     fn resolve_implementation(&mut self,
1907                               generics: &Generics,
1908                               opt_trait_reference: &Option<TraitRef>,
1909                               self_type: &Ty,
1910                               item_id: NodeId,
1911                               impl_items: &[ImplItem]) {
1912         // If applicable, create a rib for the type parameters.
1913         self.with_type_parameter_rib(HasTypeParameters(generics, ItemRibKind), |this| {
1914             // Resolve the type parameters.
1915             this.visit_generics(generics);
1916
1917             // Resolve the trait reference, if necessary.
1918             this.with_optional_trait_ref(opt_trait_reference.as_ref(), |this, trait_id| {
1919                 // Resolve the self type.
1920                 this.visit_ty(self_type);
1921
1922                 this.with_self_rib(Def::SelfTy(trait_id, Some(item_id)), |this| {
1923                     this.with_current_self_type(self_type, |this| {
1924                         for impl_item in impl_items {
1925                             this.resolve_visibility(&impl_item.vis);
1926                             match impl_item.node {
1927                                 ImplItemKind::Const(..) => {
1928                                     // If this is a trait impl, ensure the const
1929                                     // exists in trait
1930                                     this.check_trait_item(impl_item.ident.name,
1931                                                           impl_item.span,
1932                                         |n, s| ResolutionError::ConstNotMemberOfTrait(n, s));
1933                                     visit::walk_impl_item(this, impl_item);
1934                                 }
1935                                 ImplItemKind::Method(ref sig, _) => {
1936                                     // If this is a trait impl, ensure the method
1937                                     // exists in trait
1938                                     this.check_trait_item(impl_item.ident.name,
1939                                                           impl_item.span,
1940                                         |n, s| ResolutionError::MethodNotMemberOfTrait(n, s));
1941
1942                                     // We also need a new scope for the method-
1943                                     // specific type parameters.
1944                                     let type_parameters =
1945                                         HasTypeParameters(&sig.generics,
1946                                                           MethodRibKind(!sig.decl.has_self()));
1947                                     this.with_type_parameter_rib(type_parameters, |this| {
1948                                         visit::walk_impl_item(this, impl_item);
1949                                     });
1950                                 }
1951                                 ImplItemKind::Type(ref ty) => {
1952                                     // If this is a trait impl, ensure the type
1953                                     // exists in trait
1954                                     this.check_trait_item(impl_item.ident.name,
1955                                                           impl_item.span,
1956                                         |n, s| ResolutionError::TypeNotMemberOfTrait(n, s));
1957
1958                                     this.visit_ty(ty);
1959                                 }
1960                                 ImplItemKind::Macro(_) => panic!("unexpanded macro in resolve!"),
1961                             }
1962                         }
1963                     });
1964                 });
1965             });
1966         });
1967     }
1968
1969     fn check_trait_item<F>(&self, name: Name, span: Span, err: F)
1970         where F: FnOnce(Name, &str) -> ResolutionError
1971     {
1972         // If there is a TraitRef in scope for an impl, then the method must be in the
1973         // trait.
1974         if let Some((did, ref trait_ref)) = self.current_trait_ref {
1975             if !self.trait_item_map.contains_key(&(name, did)) {
1976                 let path_str = path_names_to_string(&trait_ref.path, 0);
1977                 resolve_error(self, span, err(name, &path_str));
1978             }
1979         }
1980     }
1981
1982     fn resolve_local(&mut self, local: &Local) {
1983         // Resolve the type.
1984         walk_list!(self, visit_ty, &local.ty);
1985
1986         // Resolve the initializer.
1987         walk_list!(self, visit_expr, &local.init);
1988
1989         // Resolve the pattern.
1990         self.resolve_pattern(&local.pat, PatternSource::Let, &mut HashMap::new());
1991     }
1992
1993     // build a map from pattern identifiers to binding-info's.
1994     // this is done hygienically. This could arise for a macro
1995     // that expands into an or-pattern where one 'x' was from the
1996     // user and one 'x' came from the macro.
1997     fn binding_mode_map(&mut self, pat: &Pat) -> BindingMap {
1998         let mut binding_map = HashMap::new();
1999
2000         pat.walk(&mut |pat| {
2001             if let PatKind::Ident(binding_mode, ident, ref sub_pat) = pat.node {
2002                 if sub_pat.is_some() || match self.def_map.get(&pat.id) {
2003                     Some(&PathResolution { base_def: Def::Local(..), .. }) => true,
2004                     _ => false,
2005                 } {
2006                     let binding_info = BindingInfo { span: ident.span, binding_mode: binding_mode };
2007                     binding_map.insert(ident.node, binding_info);
2008                 }
2009             }
2010             true
2011         });
2012
2013         binding_map
2014     }
2015
2016     // check that all of the arms in an or-pattern have exactly the
2017     // same set of bindings, with the same binding modes for each.
2018     fn check_consistent_bindings(&mut self, arm: &Arm) {
2019         if arm.pats.is_empty() {
2020             return;
2021         }
2022         let map_0 = self.binding_mode_map(&arm.pats[0]);
2023         for (i, p) in arm.pats.iter().enumerate() {
2024             let map_i = self.binding_mode_map(&p);
2025
2026             for (&key, &binding_0) in &map_0 {
2027                 match map_i.get(&key) {
2028                     None => {
2029                         let error = ResolutionError::VariableNotBoundInPattern(key.name, 1, i + 1);
2030                         resolve_error(self, p.span, error);
2031                     }
2032                     Some(binding_i) => {
2033                         if binding_0.binding_mode != binding_i.binding_mode {
2034                             resolve_error(self,
2035                                           binding_i.span,
2036                                           ResolutionError::VariableBoundWithDifferentMode(
2037                                               key.name,
2038                                               i + 1,
2039                                               binding_0.span));
2040                         }
2041                     }
2042                 }
2043             }
2044
2045             for (&key, &binding) in &map_i {
2046                 if !map_0.contains_key(&key) {
2047                     resolve_error(self,
2048                                   binding.span,
2049                                   ResolutionError::VariableNotBoundInPattern(key.name, i + 1, 1));
2050                 }
2051             }
2052         }
2053     }
2054
2055     fn resolve_arm(&mut self, arm: &Arm) {
2056         self.value_ribs.push(Rib::new(NormalRibKind));
2057
2058         let mut bindings_list = HashMap::new();
2059         for pattern in &arm.pats {
2060             self.resolve_pattern(&pattern, PatternSource::Match, &mut bindings_list);
2061         }
2062
2063         // This has to happen *after* we determine which
2064         // pat_idents are variants
2065         self.check_consistent_bindings(arm);
2066
2067         walk_list!(self, visit_expr, &arm.guard);
2068         self.visit_expr(&arm.body);
2069
2070         self.value_ribs.pop();
2071     }
2072
2073     fn resolve_block(&mut self, block: &Block) {
2074         debug!("(resolving block) entering block");
2075         // Move down in the graph, if there's an anonymous module rooted here.
2076         let orig_module = self.current_module;
2077         let anonymous_module = self.module_map.get(&block.id).cloned(); // clones a reference
2078
2079         let mut num_macro_definition_ribs = 0;
2080         if let Some(anonymous_module) = anonymous_module {
2081             debug!("(resolving block) found anonymous module, moving down");
2082             self.value_ribs.push(Rib::new(ModuleRibKind(anonymous_module)));
2083             self.type_ribs.push(Rib::new(ModuleRibKind(anonymous_module)));
2084             self.current_module = anonymous_module;
2085         } else {
2086             self.value_ribs.push(Rib::new(NormalRibKind));
2087         }
2088
2089         // Descend into the block.
2090         for stmt in &block.stmts {
2091             if let Some(marks) = self.macros_at_scope.remove(&stmt.id) {
2092                 num_macro_definition_ribs += marks.len() as u32;
2093                 for mark in marks {
2094                     self.value_ribs.push(Rib::new(MacroDefinition(mark)));
2095                     self.label_ribs.push(Rib::new(MacroDefinition(mark)));
2096                 }
2097             }
2098
2099             self.visit_stmt(stmt);
2100         }
2101
2102         // Move back up.
2103         self.current_module = orig_module;
2104         for _ in 0 .. num_macro_definition_ribs {
2105             self.value_ribs.pop();
2106             self.label_ribs.pop();
2107         }
2108         self.value_ribs.pop();
2109         if let Some(_) = anonymous_module {
2110             self.type_ribs.pop();
2111         }
2112         debug!("(resolving block) leaving block");
2113     }
2114
2115     fn resolve_type(&mut self, ty: &Ty) {
2116         match ty.node {
2117             TyKind::Path(ref maybe_qself, ref path) => {
2118                 // This is a path in the type namespace. Walk through scopes
2119                 // looking for it.
2120                 if let Some(def) = self.resolve_possibly_assoc_item(ty.id, maybe_qself.as_ref(),
2121                                                                     path, TypeNS) {
2122                     match def.base_def {
2123                         Def::Mod(..) if def.depth == 0 => {
2124                             self.session.span_err(path.span, "expected type, found module");
2125                             self.record_def(ty.id, err_path_resolution());
2126                         }
2127                         _ => {
2128                             // Write the result into the def map.
2129                             debug!("(resolving type) writing resolution for `{}` (id {}) = {:?}",
2130                                    path_names_to_string(path, 0), ty.id, def);
2131                             self.record_def(ty.id, def);
2132                         }
2133                     }
2134                 } else {
2135                     self.record_def(ty.id, err_path_resolution());
2136
2137                     // Keep reporting some errors even if they're ignored above.
2138                     if let Err(true) = self.resolve_path(ty.id, path, 0, TypeNS) {
2139                         // `resolve_path` already reported the error
2140                     } else {
2141                         let kind = if maybe_qself.is_some() {
2142                             "associated type"
2143                         } else {
2144                             "type name"
2145                         };
2146
2147                         let is_invalid_self_type_name = path.segments.len() > 0 &&
2148                                                         maybe_qself.is_none() &&
2149                                                         path.segments[0].identifier.name ==
2150                                                         keywords::SelfType.name();
2151                         if is_invalid_self_type_name {
2152                             resolve_error(self,
2153                                           ty.span,
2154                                           ResolutionError::SelfUsedOutsideImplOrTrait);
2155                         } else {
2156                             let segment = path.segments.last();
2157                             let segment = segment.expect("missing name in path");
2158                             let type_name = segment.identifier.name;
2159
2160                             let candidates =
2161                                 self.lookup_candidates(
2162                                     type_name,
2163                                     TypeNS,
2164                                     |def| match def {
2165                                         Def::Trait(_) |
2166                                         Def::Enum(_) |
2167                                         Def::Struct(_) |
2168                                         Def::TyAlias(_) => true,
2169                                         _               => false,
2170                                     },
2171                                 );
2172
2173                             // create error object
2174                             let name = &path_names_to_string(path, 0);
2175                             let error =
2176                                 ResolutionError::UseOfUndeclared(
2177                                     kind,
2178                                     name,
2179                                     candidates,
2180                                 );
2181
2182                             resolve_error(self, ty.span, error);
2183                         }
2184                     }
2185                 }
2186             }
2187             _ => {}
2188         }
2189         // Resolve embedded types.
2190         visit::walk_ty(self, ty);
2191     }
2192
2193     fn fresh_binding(&mut self,
2194                      ident: &ast::SpannedIdent,
2195                      pat_id: NodeId,
2196                      outer_pat_id: NodeId,
2197                      pat_src: PatternSource,
2198                      bindings: &mut HashMap<ast::Ident, NodeId>)
2199                      -> PathResolution {
2200         // Add the binding to the local ribs, if it
2201         // doesn't already exist in the bindings map. (We
2202         // must not add it if it's in the bindings map
2203         // because that breaks the assumptions later
2204         // passes make about or-patterns.)
2205         let mut def = Def::Local(self.definitions.local_def_id(pat_id), pat_id);
2206         match bindings.get(&ident.node).cloned() {
2207             Some(id) if id == outer_pat_id => {
2208                 // `Variant(a, a)`, error
2209                 resolve_error(
2210                     self,
2211                     ident.span,
2212                     ResolutionError::IdentifierBoundMoreThanOnceInSamePattern(
2213                         &ident.node.name.as_str())
2214                 );
2215             }
2216             Some(..) if pat_src == PatternSource::FnParam => {
2217                 // `fn f(a: u8, a: u8)`, error
2218                 resolve_error(
2219                     self,
2220                     ident.span,
2221                     ResolutionError::IdentifierBoundMoreThanOnceInParameterList(
2222                         &ident.node.name.as_str())
2223                 );
2224             }
2225             Some(..) if pat_src == PatternSource::Match => {
2226                 // `Variant1(a) | Variant2(a)`, ok
2227                 // Reuse definition from the first `a`.
2228                 def = self.value_ribs.last_mut().unwrap().bindings[&ident.node];
2229             }
2230             Some(..) => {
2231                 span_bug!(ident.span, "two bindings with the same name from \
2232                                        unexpected pattern source {:?}", pat_src);
2233             }
2234             None => {
2235                 // A completely fresh binding, add to the lists if it's valid.
2236                 if ident.node.name != keywords::Invalid.name() {
2237                     bindings.insert(ident.node, outer_pat_id);
2238                     self.value_ribs.last_mut().unwrap().bindings.insert(ident.node, def);
2239                 }
2240             }
2241         }
2242
2243         PathResolution::new(def)
2244     }
2245
2246     fn resolve_pattern_path<ExpectedFn>(&mut self,
2247                                         pat_id: NodeId,
2248                                         qself: Option<&QSelf>,
2249                                         path: &Path,
2250                                         namespace: Namespace,
2251                                         expected_fn: ExpectedFn,
2252                                         expected_what: &str)
2253         where ExpectedFn: FnOnce(Def) -> bool
2254     {
2255         let resolution = if let Some(resolution) = self.resolve_possibly_assoc_item(pat_id,
2256                                                                         qself, path, namespace) {
2257             if resolution.depth == 0 {
2258                 if expected_fn(resolution.base_def) || resolution.base_def == Def::Err {
2259                     resolution
2260                 } else {
2261                     resolve_error(
2262                         self,
2263                         path.span,
2264                         ResolutionError::PatPathUnexpected(expected_what,
2265                                                            resolution.kind_name(), path)
2266                     );
2267                     err_path_resolution()
2268                 }
2269             } else {
2270                 // Not fully resolved associated item `T::A::B` or `<T as Tr>::A::B`
2271                 // or `<T>::A::B`. If `B` should be resolved in value namespace then
2272                 // it needs to be added to the trait map.
2273                 if namespace == ValueNS {
2274                     let item_name = path.segments.last().unwrap().identifier.name;
2275                     let traits = self.get_traits_containing_item(item_name);
2276                     self.trait_map.insert(pat_id, traits);
2277                 }
2278                 resolution
2279             }
2280         } else {
2281             if let Err(false) = self.resolve_path(pat_id, path, 0, namespace) {
2282                 resolve_error(
2283                     self,
2284                     path.span,
2285                     ResolutionError::PatPathUnresolved(expected_what, path)
2286                 );
2287             }
2288             err_path_resolution()
2289         };
2290
2291         self.record_def(pat_id, resolution);
2292     }
2293
2294     fn resolve_pattern(&mut self,
2295                        pat: &Pat,
2296                        pat_src: PatternSource,
2297                        // Maps idents to the node ID for the
2298                        // outermost pattern that binds them.
2299                        bindings: &mut HashMap<ast::Ident, NodeId>) {
2300         // Visit all direct subpatterns of this pattern.
2301         let outer_pat_id = pat.id;
2302         pat.walk(&mut |pat| {
2303             match pat.node {
2304                 PatKind::Ident(bmode, ref ident, ref opt_pat) => {
2305                     // First try to resolve the identifier as some existing
2306                     // entity, then fall back to a fresh binding.
2307                     let binding = self.resolve_ident_in_lexical_scope(ident.node, ValueNS, false)
2308                                       .and_then(LexicalScopeBinding::item);
2309                     let resolution = binding.and_then(NameBinding::def).and_then(|def| {
2310                         let always_binding = !pat_src.is_refutable() || opt_pat.is_some() ||
2311                                              bmode != BindingMode::ByValue(Mutability::Immutable);
2312                         match def {
2313                             Def::Struct(..) | Def::Variant(..) |
2314                             Def::Const(..) | Def::AssociatedConst(..) if !always_binding => {
2315                                 // A constant, unit variant, etc pattern.
2316                                 self.record_use(ident.node.name, ValueNS, binding.unwrap());
2317                                 Some(PathResolution::new(def))
2318                             }
2319                             Def::Struct(..) | Def::Variant(..) |
2320                             Def::Const(..) | Def::AssociatedConst(..) | Def::Static(..) => {
2321                                 // A fresh binding that shadows something unacceptable.
2322                                 resolve_error(
2323                                     self,
2324                                     ident.span,
2325                                     ResolutionError::BindingShadowsSomethingUnacceptable(
2326                                         pat_src.descr(), ident.node.name, binding.unwrap())
2327                                 );
2328                                 None
2329                             }
2330                             Def::Local(..) | Def::Upvar(..) | Def::Fn(..) | Def::Err => {
2331                                 // These entities are explicitly allowed
2332                                 // to be shadowed by fresh bindings.
2333                                 None
2334                             }
2335                             def => {
2336                                 span_bug!(ident.span, "unexpected definition for an \
2337                                                        identifier in pattern {:?}", def);
2338                             }
2339                         }
2340                     }).unwrap_or_else(|| {
2341                         self.fresh_binding(ident, pat.id, outer_pat_id, pat_src, bindings)
2342                     });
2343
2344                     self.record_def(pat.id, resolution);
2345                 }
2346
2347                 PatKind::TupleStruct(ref path, _, _) => {
2348                     self.resolve_pattern_path(pat.id, None, path, ValueNS, |def| {
2349                         match def {
2350                             Def::Struct(..) | Def::Variant(..) => true,
2351                             _ => false,
2352                         }
2353                     }, "variant or struct");
2354                 }
2355
2356                 PatKind::Path(ref qself, ref path) => {
2357                     self.resolve_pattern_path(pat.id, qself.as_ref(), path, ValueNS, |def| {
2358                         match def {
2359                             Def::Struct(..) | Def::Variant(..) |
2360                             Def::Const(..) | Def::AssociatedConst(..) => true,
2361                             _ => false,
2362                         }
2363                     }, "variant, struct or constant");
2364                 }
2365
2366                 PatKind::Struct(ref path, _, _) => {
2367                     self.resolve_pattern_path(pat.id, None, path, TypeNS, |def| {
2368                         match def {
2369                             Def::Struct(..) | Def::Variant(..) |
2370                             Def::TyAlias(..) | Def::AssociatedTy(..) => true,
2371                             _ => false,
2372                         }
2373                     }, "variant, struct or type alias");
2374                 }
2375
2376                 _ => {}
2377             }
2378             true
2379         });
2380
2381         visit::walk_pat(self, pat);
2382     }
2383
2384     /// Handles paths that may refer to associated items
2385     fn resolve_possibly_assoc_item(&mut self,
2386                                    id: NodeId,
2387                                    maybe_qself: Option<&QSelf>,
2388                                    path: &Path,
2389                                    namespace: Namespace)
2390                                    -> Option<PathResolution> {
2391         let max_assoc_types;
2392
2393         match maybe_qself {
2394             Some(qself) => {
2395                 if qself.position == 0 {
2396                     // FIXME: Create some fake resolution that can't possibly be a type.
2397                     return Some(PathResolution {
2398                         base_def: Def::Mod(self.definitions.local_def_id(ast::CRATE_NODE_ID)),
2399                         depth: path.segments.len(),
2400                     });
2401                 }
2402                 max_assoc_types = path.segments.len() - qself.position;
2403                 // Make sure the trait is valid.
2404                 let _ = self.resolve_trait_reference(id, path, max_assoc_types);
2405             }
2406             None => {
2407                 max_assoc_types = path.segments.len();
2408             }
2409         }
2410
2411         let mut resolution = self.with_no_errors(|this| {
2412             this.resolve_path(id, path, 0, namespace).ok()
2413         });
2414         for depth in 1..max_assoc_types {
2415             if resolution.is_some() {
2416                 break;
2417             }
2418             self.with_no_errors(|this| {
2419                 let partial_resolution = this.resolve_path(id, path, depth, TypeNS).ok();
2420                 if let Some(Def::Mod(..)) = partial_resolution.map(|r| r.base_def) {
2421                     // Modules cannot have associated items
2422                 } else {
2423                     resolution = partial_resolution;
2424                 }
2425             });
2426         }
2427         resolution
2428     }
2429
2430     /// Skips `path_depth` trailing segments, which is also reflected in the
2431     /// returned value. See `hir::def::PathResolution` for more info.
2432     fn resolve_path(&mut self, id: NodeId, path: &Path, path_depth: usize, namespace: Namespace)
2433                     -> Result<PathResolution, bool /* true if an error was reported */ > {
2434         debug!("resolve_path(id={:?} path={:?}, path_depth={:?})", id, path, path_depth);
2435
2436         let span = path.span;
2437         let segments = &path.segments[..path.segments.len() - path_depth];
2438
2439         let mk_res = |def| PathResolution { base_def: def, depth: path_depth };
2440
2441         if path.global {
2442             let binding = self.resolve_crate_relative_path(span, segments, namespace);
2443             return binding.map(|binding| mk_res(binding.def().unwrap()));
2444         }
2445
2446         // Try to find a path to an item in a module.
2447         let last_ident = segments.last().unwrap().identifier;
2448         // Resolve a single identifier with fallback to primitive types
2449         let resolve_identifier_with_fallback = |this: &mut Self, record_used| {
2450             let def = this.resolve_identifier(last_ident, namespace, record_used);
2451             match def {
2452                 None | Some(LocalDef{def: Def::Mod(..), ..}) if namespace == TypeNS =>
2453                     this.primitive_type_table
2454                         .primitive_types
2455                         .get(&last_ident.name)
2456                         .map_or(def, |prim_ty| Some(LocalDef::from_def(Def::PrimTy(*prim_ty)))),
2457                 _ => def
2458             }
2459         };
2460
2461         if segments.len() == 1 {
2462             // In `a(::assoc_item)*` `a` cannot be a module. If `a` does resolve to a module we
2463             // don't report an error right away, but try to fallback to a primitive type.
2464             // So, we are still able to successfully resolve something like
2465             //
2466             // use std::u8; // bring module u8 in scope
2467             // fn f() -> u8 { // OK, resolves to primitive u8, not to std::u8
2468             //     u8::max_value() // OK, resolves to associated function <u8>::max_value,
2469             //                     // not to non-existent std::u8::max_value
2470             // }
2471             //
2472             // Such behavior is required for backward compatibility.
2473             // The same fallback is used when `a` resolves to nothing.
2474             let def = resolve_identifier_with_fallback(self, true).ok_or(false);
2475             return def.and_then(|def| self.adjust_local_def(def, span).ok_or(true)).map(mk_res);
2476         }
2477
2478         let unqualified_def = resolve_identifier_with_fallback(self, false);
2479         let qualified_binding = self.resolve_module_relative_path(span, segments, namespace);
2480         match (qualified_binding, unqualified_def) {
2481             (Ok(binding), Some(ref ud)) if binding.def().unwrap() == ud.def => {
2482                 self.session
2483                     .add_lint(lint::builtin::UNUSED_QUALIFICATIONS,
2484                               id,
2485                               span,
2486                               "unnecessary qualification".to_string());
2487             }
2488             _ => {}
2489         }
2490
2491         qualified_binding.map(|binding| mk_res(binding.def().unwrap()))
2492     }
2493
2494     // Resolve a single identifier
2495     fn resolve_identifier(&mut self,
2496                           identifier: ast::Ident,
2497                           namespace: Namespace,
2498                           record_used: bool)
2499                           -> Option<LocalDef> {
2500         if identifier.name == keywords::Invalid.name() {
2501             return None;
2502         }
2503
2504         self.resolve_ident_in_lexical_scope(identifier, namespace, record_used)
2505             .map(LexicalScopeBinding::local_def)
2506     }
2507
2508     // Resolve a local definition, potentially adjusting for closures.
2509     fn adjust_local_def(&mut self, local_def: LocalDef, span: Span) -> Option<Def> {
2510         let ribs = match local_def.ribs {
2511             Some((TypeNS, i)) => &self.type_ribs[i + 1..],
2512             Some((ValueNS, i)) => &self.value_ribs[i + 1..],
2513             _ => &[] as &[_],
2514         };
2515         let mut def = local_def.def;
2516         match def {
2517             Def::Upvar(..) => {
2518                 span_bug!(span, "unexpected {:?} in bindings", def)
2519             }
2520             Def::Local(_, node_id) => {
2521                 for rib in ribs {
2522                     match rib.kind {
2523                         NormalRibKind | ModuleRibKind(..) | MacroDefinition(..) => {
2524                             // Nothing to do. Continue.
2525                         }
2526                         ClosureRibKind(function_id) => {
2527                             let prev_def = def;
2528                             let node_def_id = self.definitions.local_def_id(node_id);
2529
2530                             let seen = self.freevars_seen
2531                                            .entry(function_id)
2532                                            .or_insert_with(|| NodeMap());
2533                             if let Some(&index) = seen.get(&node_id) {
2534                                 def = Def::Upvar(node_def_id, node_id, index, function_id);
2535                                 continue;
2536                             }
2537                             let vec = self.freevars
2538                                           .entry(function_id)
2539                                           .or_insert_with(|| vec![]);
2540                             let depth = vec.len();
2541                             vec.push(Freevar {
2542                                 def: prev_def,
2543                                 span: span,
2544                             });
2545
2546                             def = Def::Upvar(node_def_id, node_id, depth, function_id);
2547                             seen.insert(node_id, depth);
2548                         }
2549                         ItemRibKind | MethodRibKind(_) => {
2550                             // This was an attempt to access an upvar inside a
2551                             // named function item. This is not allowed, so we
2552                             // report an error.
2553                             resolve_error(self,
2554                                           span,
2555                                           ResolutionError::CannotCaptureDynamicEnvironmentInFnItem);
2556                             return None;
2557                         }
2558                         ConstantItemRibKind => {
2559                             // Still doesn't deal with upvars
2560                             resolve_error(self,
2561                                           span,
2562                                           ResolutionError::AttemptToUseNonConstantValueInConstant);
2563                             return None;
2564                         }
2565                     }
2566                 }
2567             }
2568             Def::TyParam(..) | Def::SelfTy(..) => {
2569                 for rib in ribs {
2570                     match rib.kind {
2571                         NormalRibKind | MethodRibKind(_) | ClosureRibKind(..) |
2572                         ModuleRibKind(..) | MacroDefinition(..) => {
2573                             // Nothing to do. Continue.
2574                         }
2575                         ItemRibKind => {
2576                             // This was an attempt to use a type parameter outside
2577                             // its scope.
2578
2579                             resolve_error(self,
2580                                           span,
2581                                           ResolutionError::TypeParametersFromOuterFunction);
2582                             return None;
2583                         }
2584                         ConstantItemRibKind => {
2585                             // see #9186
2586                             resolve_error(self, span, ResolutionError::OuterTypeParameterContext);
2587                             return None;
2588                         }
2589                     }
2590                 }
2591             }
2592             _ => {}
2593         }
2594         return Some(def);
2595     }
2596
2597     // resolve a "module-relative" path, e.g. a::b::c
2598     fn resolve_module_relative_path(&mut self,
2599                                     span: Span,
2600                                     segments: &[ast::PathSegment],
2601                                     namespace: Namespace)
2602                                     -> Result<&'a NameBinding<'a>,
2603                                               bool /* true if an error was reported */> {
2604         let module_path = segments.split_last()
2605                                   .unwrap()
2606                                   .1
2607                                   .iter()
2608                                   .map(|ps| ps.identifier.name)
2609                                   .collect::<Vec<_>>();
2610
2611         let containing_module;
2612         match self.resolve_module_path(&module_path, UseLexicalScope, span) {
2613             Failed(err) => {
2614                 let (span, msg) = match err {
2615                     Some((span, msg)) => (span, msg),
2616                     None => {
2617                         let msg = format!("Use of undeclared type or module `{}`",
2618                                           names_to_string(&module_path));
2619                         (span, msg)
2620                     }
2621                 };
2622
2623                 resolve_error(self, span, ResolutionError::FailedToResolve(&msg));
2624                 return Err(true);
2625             }
2626             Indeterminate => return Err(false),
2627             Success(resulting_module) => {
2628                 containing_module = resulting_module;
2629             }
2630         }
2631
2632         let name = segments.last().unwrap().identifier.name;
2633         let result = self.resolve_name_in_module(containing_module, name, namespace, false, true);
2634         result.success().map(|binding| {
2635             self.check_privacy(name, binding, span);
2636             binding
2637         }).ok_or(false)
2638     }
2639
2640     /// Invariant: This must be called only during main resolution, not during
2641     /// import resolution.
2642     fn resolve_crate_relative_path<T>(&mut self, span: Span, segments: &[T], namespace: Namespace)
2643                                       -> Result<&'a NameBinding<'a>,
2644                                                 bool /* true if an error was reported */>
2645         where T: Named,
2646     {
2647         let module_path = segments.split_last().unwrap().1.iter().map(T::name).collect::<Vec<_>>();
2648         let root_module = self.graph_root;
2649
2650         let containing_module;
2651         match self.resolve_module_path_from_root(root_module,
2652                                                  &module_path,
2653                                                  0,
2654                                                  span) {
2655             Failed(err) => {
2656                 let (span, msg) = match err {
2657                     Some((span, msg)) => (span, msg),
2658                     None => {
2659                         let msg = format!("Use of undeclared module `::{}`",
2660                                           names_to_string(&module_path));
2661                         (span, msg)
2662                     }
2663                 };
2664
2665                 resolve_error(self, span, ResolutionError::FailedToResolve(&msg));
2666                 return Err(true);
2667             }
2668
2669             Indeterminate => return Err(false),
2670
2671             Success(resulting_module) => {
2672                 containing_module = resulting_module;
2673             }
2674         }
2675
2676         let name = segments.last().unwrap().name();
2677         let result = self.resolve_name_in_module(containing_module, name, namespace, false, true);
2678         result.success().map(|binding| {
2679             self.check_privacy(name, binding, span);
2680             binding
2681         }).ok_or(false)
2682     }
2683
2684     fn with_no_errors<T, F>(&mut self, f: F) -> T
2685         where F: FnOnce(&mut Resolver) -> T
2686     {
2687         self.emit_errors = false;
2688         let rs = f(self);
2689         self.emit_errors = true;
2690         rs
2691     }
2692
2693     // Calls `f` with a `Resolver` whose current lexical scope is `module`'s lexical scope,
2694     // i.e. the module's items and the prelude (unless the module is `#[no_implicit_prelude]`).
2695     // FIXME #34673: This needs testing.
2696     pub fn with_module_lexical_scope<T, F>(&mut self, module: Module<'a>, f: F) -> T
2697         where F: FnOnce(&mut Resolver<'a>) -> T,
2698     {
2699         self.with_empty_ribs(|this| {
2700             this.value_ribs.push(Rib::new(ModuleRibKind(module)));
2701             this.type_ribs.push(Rib::new(ModuleRibKind(module)));
2702             f(this)
2703         })
2704     }
2705
2706     fn with_empty_ribs<T, F>(&mut self, f: F) -> T
2707         where F: FnOnce(&mut Resolver<'a>) -> T,
2708     {
2709         use ::std::mem::replace;
2710         let value_ribs = replace(&mut self.value_ribs, Vec::new());
2711         let type_ribs = replace(&mut self.type_ribs, Vec::new());
2712         let label_ribs = replace(&mut self.label_ribs, Vec::new());
2713
2714         let result = f(self);
2715         self.value_ribs = value_ribs;
2716         self.type_ribs = type_ribs;
2717         self.label_ribs = label_ribs;
2718         result
2719     }
2720
2721     fn find_fallback_in_self_type(&mut self, name: Name) -> FallbackSuggestion {
2722         fn extract_node_id(t: &Ty) -> Option<NodeId> {
2723             match t.node {
2724                 TyKind::Path(None, _) => Some(t.id),
2725                 TyKind::Rptr(_, ref mut_ty) => extract_node_id(&mut_ty.ty),
2726                 // This doesn't handle the remaining `Ty` variants as they are not
2727                 // that commonly the self_type, it might be interesting to provide
2728                 // support for those in future.
2729                 _ => None,
2730             }
2731         }
2732
2733         if let Some(node_id) = self.current_self_type.as_ref().and_then(extract_node_id) {
2734             // Look for a field with the same name in the current self_type.
2735             if let Some(resolution) = self.def_map.get(&node_id) {
2736                 match resolution.base_def {
2737                     Def::Enum(did) | Def::TyAlias(did) |
2738                     Def::Struct(did) | Def::Variant(_, did) if resolution.depth == 0 => {
2739                         if let Some(fields) = self.structs.get(&did) {
2740                             if fields.iter().any(|&field_name| name == field_name) {
2741                                 return Field;
2742                             }
2743                         }
2744                     }
2745                     _ => {}
2746                 }
2747             }
2748         }
2749
2750         // Look for a method in the current trait.
2751         if let Some((trait_did, ref trait_ref)) = self.current_trait_ref {
2752             if let Some(&is_static_method) = self.trait_item_map.get(&(name, trait_did)) {
2753                 if is_static_method {
2754                     return TraitMethod(path_names_to_string(&trait_ref.path, 0));
2755                 } else {
2756                     return TraitItem;
2757                 }
2758             }
2759         }
2760
2761         NoSuggestion
2762     }
2763
2764     fn find_best_match(&mut self, name: &str) -> SuggestionType {
2765         if let Some(macro_name) = self.session.available_macros
2766                                   .borrow().iter().find(|n| n.as_str() == name) {
2767             return SuggestionType::Macro(format!("{}!", macro_name));
2768         }
2769
2770         let names = self.value_ribs
2771                     .iter()
2772                     .rev()
2773                     .flat_map(|rib| rib.bindings.keys().map(|ident| &ident.name));
2774
2775         if let Some(found) = find_best_match_for_name(names, name, None) {
2776             if name != found {
2777                 return SuggestionType::Function(found);
2778             }
2779         } SuggestionType::NotFound
2780     }
2781
2782     fn resolve_labeled_block(&mut self, label: Option<ast::Ident>, id: NodeId, block: &Block) {
2783         if let Some(label) = label {
2784             let def = Def::Label(id);
2785             self.with_label_rib(|this| {
2786                 this.label_ribs.last_mut().unwrap().bindings.insert(label, def);
2787                 this.visit_block(block);
2788             });
2789         } else {
2790             self.visit_block(block);
2791         }
2792     }
2793
2794     fn resolve_expr(&mut self, expr: &Expr, parent: Option<&Expr>) {
2795         // First, record candidate traits for this expression if it could
2796         // result in the invocation of a method call.
2797
2798         self.record_candidate_traits_for_expr_if_necessary(expr);
2799
2800         // Next, resolve the node.
2801         match expr.node {
2802             ExprKind::Path(ref maybe_qself, ref path) => {
2803                 // This is a local path in the value namespace. Walk through
2804                 // scopes looking for it.
2805                 if let Some(path_res) = self.resolve_possibly_assoc_item(expr.id,
2806                                                             maybe_qself.as_ref(), path, ValueNS) {
2807                     // Check if struct variant
2808                     let is_struct_variant = if let Def::Variant(_, variant_id) = path_res.base_def {
2809                         self.structs.contains_key(&variant_id)
2810                     } else {
2811                         false
2812                     };
2813                     if is_struct_variant {
2814                         let _ = self.structs.contains_key(&path_res.base_def.def_id());
2815                         let path_name = path_names_to_string(path, 0);
2816
2817                         let mut err = resolve_struct_error(self,
2818                                         expr.span,
2819                                         ResolutionError::StructVariantUsedAsFunction(&path_name));
2820
2821                         let msg = format!("did you mean to write: `{} {{ /* fields */ }}`?",
2822                                           path_name);
2823                         if self.emit_errors {
2824                             err.help(&msg);
2825                         } else {
2826                             err.span_help(expr.span, &msg);
2827                         }
2828                         err.emit();
2829                         self.record_def(expr.id, err_path_resolution());
2830                     } else {
2831                         // Write the result into the def map.
2832                         debug!("(resolving expr) resolved `{}`",
2833                                path_names_to_string(path, 0));
2834
2835                         // Partial resolutions will need the set of traits in scope,
2836                         // so they can be completed during typeck.
2837                         if path_res.depth != 0 {
2838                             let method_name = path.segments.last().unwrap().identifier.name;
2839                             let traits = self.get_traits_containing_item(method_name);
2840                             self.trait_map.insert(expr.id, traits);
2841                         }
2842
2843                         self.record_def(expr.id, path_res);
2844                     }
2845                 } else {
2846                     // Be helpful if the name refers to a struct
2847                     // (The pattern matching def_tys where the id is in self.structs
2848                     // matches on regular structs while excluding tuple- and enum-like
2849                     // structs, which wouldn't result in this error.)
2850                     let path_name = path_names_to_string(path, 0);
2851                     let type_res = self.with_no_errors(|this| {
2852                         this.resolve_path(expr.id, path, 0, TypeNS)
2853                     });
2854
2855                     self.record_def(expr.id, err_path_resolution());
2856
2857                     if let Ok(Def::Struct(..)) = type_res.map(|r| r.base_def) {
2858                         let error_variant =
2859                             ResolutionError::StructVariantUsedAsFunction(&path_name);
2860                         let mut err = resolve_struct_error(self, expr.span, error_variant);
2861
2862                         let msg = format!("did you mean to write: `{} {{ /* fields */ }}`?",
2863                                           path_name);
2864
2865                         if self.emit_errors {
2866                             err.help(&msg);
2867                         } else {
2868                             err.span_help(expr.span, &msg);
2869                         }
2870                         err.emit();
2871                     } else {
2872                         // Keep reporting some errors even if they're ignored above.
2873                         if let Err(true) = self.resolve_path(expr.id, path, 0, ValueNS) {
2874                             // `resolve_path` already reported the error
2875                         } else {
2876                             let mut method_scope = false;
2877                             let mut is_static = false;
2878                             self.value_ribs.iter().rev().all(|rib| {
2879                                 method_scope = match rib.kind {
2880                                     MethodRibKind(is_static_) => {
2881                                         is_static = is_static_;
2882                                         true
2883                                     }
2884                                     ItemRibKind | ConstantItemRibKind => false,
2885                                     _ => return true, // Keep advancing
2886                                 };
2887                                 false // Stop advancing
2888                             });
2889
2890                             if method_scope &&
2891                                     &path_name[..] == keywords::SelfValue.name().as_str() {
2892                                 resolve_error(self,
2893                                               expr.span,
2894                                               ResolutionError::SelfNotAvailableInStaticMethod);
2895                             } else {
2896                                 let last_name = path.segments.last().unwrap().identifier.name;
2897                                 let (mut msg, is_field) =
2898                                     match self.find_fallback_in_self_type(last_name) {
2899                                     NoSuggestion => {
2900                                         // limit search to 5 to reduce the number
2901                                         // of stupid suggestions
2902                                         (match self.find_best_match(&path_name) {
2903                                             SuggestionType::Macro(s) => {
2904                                                 format!("the macro `{}`", s)
2905                                             }
2906                                             SuggestionType::Function(s) => format!("`{}`", s),
2907                                             SuggestionType::NotFound => "".to_string(),
2908                                         }, false)
2909                                     }
2910                                     Field => {
2911                                         (if is_static && method_scope {
2912                                             "".to_string()
2913                                         } else {
2914                                             format!("`self.{}`", path_name)
2915                                         }, true)
2916                                     }
2917                                     TraitItem => (format!("to call `self.{}`", path_name), false),
2918                                     TraitMethod(path_str) =>
2919                                         (format!("to call `{}::{}`", path_str, path_name), false),
2920                                 };
2921
2922                                 let mut context =  UnresolvedNameContext::Other;
2923                                 let mut def = Def::Err;
2924                                 if !msg.is_empty() {
2925                                     msg = format!(". Did you mean {}?", msg);
2926                                 } else {
2927                                     // we display a help message if this is a module
2928                                     let name_path = path.segments.iter()
2929                                                         .map(|seg| seg.identifier.name)
2930                                                         .collect::<Vec<_>>();
2931
2932                                     match self.resolve_module_path(&name_path[..],
2933                                                                    UseLexicalScope,
2934                                                                    expr.span) {
2935                                         Success(e) => {
2936                                             if let Some(def_type) = e.def {
2937                                                 def = def_type;
2938                                             }
2939                                             context = UnresolvedNameContext::PathIsMod(parent);
2940                                         },
2941                                         _ => {},
2942                                     };
2943                                 }
2944
2945                                 resolve_error(self,
2946                                               expr.span,
2947                                               ResolutionError::UnresolvedName {
2948                                                   path: &path_name,
2949                                                   message: &msg,
2950                                                   context: context,
2951                                                   is_static_method: method_scope && is_static,
2952                                                   is_field: is_field,
2953                                                   def: def,
2954                                               });
2955                             }
2956                         }
2957                     }
2958                 }
2959
2960                 visit::walk_expr(self, expr);
2961             }
2962
2963             ExprKind::Struct(ref path, _, _) => {
2964                 // Resolve the path to the structure it goes to. We don't
2965                 // check to ensure that the path is actually a structure; that
2966                 // is checked later during typeck.
2967                 match self.resolve_path(expr.id, path, 0, TypeNS) {
2968                     Ok(definition) => self.record_def(expr.id, definition),
2969                     Err(true) => self.record_def(expr.id, err_path_resolution()),
2970                     Err(false) => {
2971                         debug!("(resolving expression) didn't find struct def",);
2972
2973                         resolve_error(self,
2974                                       path.span,
2975                                       ResolutionError::DoesNotNameAStruct(
2976                                                                 &path_names_to_string(path, 0))
2977                                      );
2978                         self.record_def(expr.id, err_path_resolution());
2979                     }
2980                 }
2981
2982                 visit::walk_expr(self, expr);
2983             }
2984
2985             ExprKind::Loop(_, Some(label)) | ExprKind::While(_, _, Some(label)) => {
2986                 self.with_label_rib(|this| {
2987                     let def = Def::Label(expr.id);
2988
2989                     {
2990                         let rib = this.label_ribs.last_mut().unwrap();
2991                         rib.bindings.insert(label.node, def);
2992                     }
2993
2994                     visit::walk_expr(this, expr);
2995                 })
2996             }
2997
2998             ExprKind::Break(Some(label)) | ExprKind::Continue(Some(label)) => {
2999                 match self.search_label(label.node) {
3000                     None => {
3001                         self.record_def(expr.id, err_path_resolution());
3002                         resolve_error(self,
3003                                       label.span,
3004                                       ResolutionError::UndeclaredLabel(&label.node.name.as_str()))
3005                     }
3006                     Some(def @ Def::Label(_)) => {
3007                         // Since this def is a label, it is never read.
3008                         self.record_def(expr.id, PathResolution::new(def))
3009                     }
3010                     Some(_) => {
3011                         span_bug!(expr.span, "label wasn't mapped to a label def!")
3012                     }
3013                 }
3014             }
3015
3016             ExprKind::IfLet(ref pattern, ref subexpression, ref if_block, ref optional_else) => {
3017                 self.visit_expr(subexpression);
3018
3019                 self.value_ribs.push(Rib::new(NormalRibKind));
3020                 self.resolve_pattern(pattern, PatternSource::IfLet, &mut HashMap::new());
3021                 self.visit_block(if_block);
3022                 self.value_ribs.pop();
3023
3024                 optional_else.as_ref().map(|expr| self.visit_expr(expr));
3025             }
3026
3027             ExprKind::WhileLet(ref pattern, ref subexpression, ref block, label) => {
3028                 self.visit_expr(subexpression);
3029                 self.value_ribs.push(Rib::new(NormalRibKind));
3030                 self.resolve_pattern(pattern, PatternSource::WhileLet, &mut HashMap::new());
3031
3032                 self.resolve_labeled_block(label.map(|l| l.node), expr.id, block);
3033
3034                 self.value_ribs.pop();
3035             }
3036
3037             ExprKind::ForLoop(ref pattern, ref subexpression, ref block, label) => {
3038                 self.visit_expr(subexpression);
3039                 self.value_ribs.push(Rib::new(NormalRibKind));
3040                 self.resolve_pattern(pattern, PatternSource::For, &mut HashMap::new());
3041
3042                 self.resolve_labeled_block(label.map(|l| l.node), expr.id, block);
3043
3044                 self.value_ribs.pop();
3045             }
3046
3047             ExprKind::Field(ref subexpression, _) => {
3048                 self.resolve_expr(subexpression, Some(expr));
3049             }
3050             ExprKind::MethodCall(_, ref types, ref arguments) => {
3051                 let mut arguments = arguments.iter();
3052                 self.resolve_expr(arguments.next().unwrap(), Some(expr));
3053                 for argument in arguments {
3054                     self.resolve_expr(argument, None);
3055                 }
3056                 for ty in types.iter() {
3057                     self.visit_ty(ty);
3058                 }
3059             }
3060
3061             _ => {
3062                 visit::walk_expr(self, expr);
3063             }
3064         }
3065     }
3066
3067     fn record_candidate_traits_for_expr_if_necessary(&mut self, expr: &Expr) {
3068         match expr.node {
3069             ExprKind::Field(_, name) => {
3070                 // FIXME(#6890): Even though you can't treat a method like a
3071                 // field, we need to add any trait methods we find that match
3072                 // the field name so that we can do some nice error reporting
3073                 // later on in typeck.
3074                 let traits = self.get_traits_containing_item(name.node.name);
3075                 self.trait_map.insert(expr.id, traits);
3076             }
3077             ExprKind::MethodCall(name, _, _) => {
3078                 debug!("(recording candidate traits for expr) recording traits for {}",
3079                        expr.id);
3080                 let traits = self.get_traits_containing_item(name.node.name);
3081                 self.trait_map.insert(expr.id, traits);
3082             }
3083             _ => {
3084                 // Nothing to do.
3085             }
3086         }
3087     }
3088
3089     fn get_traits_containing_item(&mut self, name: Name) -> Vec<TraitCandidate> {
3090         debug!("(getting traits containing item) looking for '{}'", name);
3091
3092         fn add_trait_info(found_traits: &mut Vec<TraitCandidate>,
3093                           trait_def_id: DefId,
3094                           import_id: Option<NodeId>,
3095                           name: Name) {
3096             debug!("(adding trait info) found trait {:?} for method '{}'",
3097                    trait_def_id,
3098                    name);
3099             found_traits.push(TraitCandidate {
3100                 def_id: trait_def_id,
3101                 import_id: import_id,
3102             });
3103         }
3104
3105         let mut found_traits = Vec::new();
3106         // Look for the current trait.
3107         if let Some((trait_def_id, _)) = self.current_trait_ref {
3108             if self.trait_item_map.contains_key(&(name, trait_def_id)) {
3109                 add_trait_info(&mut found_traits, trait_def_id, None, name);
3110             }
3111         }
3112
3113         let mut search_module = self.current_module;
3114         loop {
3115             // Look for trait children.
3116             let mut search_in_module = |this: &mut Self, module: Module<'a>| {
3117                 let mut traits = module.traits.borrow_mut();
3118                 if traits.is_none() {
3119                     let mut collected_traits = Vec::new();
3120                     module.for_each_child(|name, ns, binding| {
3121                         if ns != TypeNS { return }
3122                         if let Some(Def::Trait(_)) = binding.def() {
3123                             collected_traits.push((name, binding));
3124                         }
3125                     });
3126                     *traits = Some(collected_traits.into_boxed_slice());
3127                 }
3128
3129                 for &(trait_name, binding) in traits.as_ref().unwrap().iter() {
3130                     let trait_def_id = binding.def().unwrap().def_id();
3131                     if this.trait_item_map.contains_key(&(name, trait_def_id)) {
3132                         let mut import_id = None;
3133                         if let NameBindingKind::Import { directive, .. } = binding.kind {
3134                             let id = directive.id;
3135                             this.maybe_unused_trait_imports.insert(id);
3136                             this.add_to_glob_map(id, trait_name);
3137                             import_id = Some(id);
3138                         }
3139                         add_trait_info(&mut found_traits, trait_def_id, import_id, name);
3140                     }
3141                 }
3142             };
3143             search_in_module(self, search_module);
3144
3145             match search_module.parent_link {
3146                 NoParentLink | ModuleParentLink(..) => {
3147                     if !search_module.no_implicit_prelude.get() {
3148                         self.prelude.map(|prelude| search_in_module(self, prelude));
3149                     }
3150                     break;
3151                 }
3152                 BlockParentLink(parent_module, _) => {
3153                     search_module = parent_module;
3154                 }
3155             }
3156         }
3157
3158         found_traits
3159     }
3160
3161     /// When name resolution fails, this method can be used to look up candidate
3162     /// entities with the expected name. It allows filtering them using the
3163     /// supplied predicate (which should be used to only accept the types of
3164     /// definitions expected e.g. traits). The lookup spans across all crates.
3165     ///
3166     /// NOTE: The method does not look into imports, but this is not a problem,
3167     /// since we report the definitions (thus, the de-aliased imports).
3168     fn lookup_candidates<FilterFn>(&mut self,
3169                                    lookup_name: Name,
3170                                    namespace: Namespace,
3171                                    filter_fn: FilterFn) -> SuggestedCandidates
3172         where FilterFn: Fn(Def) -> bool {
3173
3174         let mut lookup_results = Vec::new();
3175         let mut worklist = Vec::new();
3176         worklist.push((self.graph_root, Vec::new(), false));
3177
3178         while let Some((in_module,
3179                         path_segments,
3180                         in_module_is_extern)) = worklist.pop() {
3181             self.populate_module_if_necessary(in_module);
3182
3183             in_module.for_each_child(|name, ns, name_binding| {
3184
3185                 // avoid imports entirely
3186                 if name_binding.is_import() { return; }
3187
3188                 // collect results based on the filter function
3189                 if let Some(def) = name_binding.def() {
3190                     if name == lookup_name && ns == namespace && filter_fn(def) {
3191                         // create the path
3192                         let ident = ast::Ident::with_empty_ctxt(name);
3193                         let params = PathParameters::none();
3194                         let segment = PathSegment {
3195                             identifier: ident,
3196                             parameters: params,
3197                         };
3198                         let span = name_binding.span;
3199                         let mut segms = path_segments.clone();
3200                         segms.push(segment);
3201                         let path = Path {
3202                             span: span,
3203                             global: true,
3204                             segments: segms,
3205                         };
3206                         // the entity is accessible in the following cases:
3207                         // 1. if it's defined in the same crate, it's always
3208                         // accessible (since private entities can be made public)
3209                         // 2. if it's defined in another crate, it's accessible
3210                         // only if both the module is public and the entity is
3211                         // declared as public (due to pruning, we don't explore
3212                         // outside crate private modules => no need to check this)
3213                         if !in_module_is_extern || name_binding.vis == ty::Visibility::Public {
3214                             lookup_results.push(path);
3215                         }
3216                     }
3217                 }
3218
3219                 // collect submodules to explore
3220                 if let Some(module) = name_binding.module() {
3221                     // form the path
3222                     let path_segments = match module.parent_link {
3223                         NoParentLink => path_segments.clone(),
3224                         ModuleParentLink(_, name) => {
3225                             let mut paths = path_segments.clone();
3226                             let ident = ast::Ident::with_empty_ctxt(name);
3227                             let params = PathParameters::none();
3228                             let segm = PathSegment {
3229                                 identifier: ident,
3230                                 parameters: params,
3231                             };
3232                             paths.push(segm);
3233                             paths
3234                         }
3235                         _ => bug!(),
3236                     };
3237
3238                     if !in_module_is_extern || name_binding.vis == ty::Visibility::Public {
3239                         // add the module to the lookup
3240                         let is_extern = in_module_is_extern || name_binding.is_extern_crate();
3241                         if !worklist.iter().any(|&(m, _, _)| m.def == module.def) {
3242                             worklist.push((module, path_segments, is_extern));
3243                         }
3244                     }
3245                 }
3246             })
3247         }
3248
3249         SuggestedCandidates {
3250             name: lookup_name.as_str().to_string(),
3251             candidates: lookup_results,
3252         }
3253     }
3254
3255     fn record_def(&mut self, node_id: NodeId, resolution: PathResolution) {
3256         debug!("(recording def) recording {:?} for {}", resolution, node_id);
3257         if let Some(prev_res) = self.def_map.insert(node_id, resolution) {
3258             panic!("path resolved multiple times ({:?} before, {:?} now)", prev_res, resolution);
3259         }
3260     }
3261
3262     fn resolve_visibility(&mut self, vis: &ast::Visibility) -> ty::Visibility {
3263         let (path, id) = match *vis {
3264             ast::Visibility::Public => return ty::Visibility::Public,
3265             ast::Visibility::Crate(_) => return ty::Visibility::Restricted(ast::CRATE_NODE_ID),
3266             ast::Visibility::Restricted { ref path, id } => (path, id),
3267             ast::Visibility::Inherited => {
3268                 let current_module =
3269                     self.get_nearest_normal_module_parent_or_self(self.current_module);
3270                 let id =
3271                     self.definitions.as_local_node_id(current_module.def_id().unwrap()).unwrap();
3272                 return ty::Visibility::Restricted(id);
3273             }
3274         };
3275
3276         let segments: Vec<_> = path.segments.iter().map(|seg| seg.identifier.name).collect();
3277         let mut path_resolution = err_path_resolution();
3278         let vis = match self.resolve_module_path(&segments, DontUseLexicalScope, path.span) {
3279             Success(module) => {
3280                 let def = module.def.unwrap();
3281                 path_resolution = PathResolution::new(def);
3282                 ty::Visibility::Restricted(self.definitions.as_local_node_id(def.def_id()).unwrap())
3283             }
3284             Failed(Some((span, msg))) => {
3285                 self.session.span_err(span, &format!("failed to resolve module path. {}", msg));
3286                 ty::Visibility::Public
3287             }
3288             _ => {
3289                 self.session.span_err(path.span, "unresolved module path");
3290                 ty::Visibility::Public
3291             }
3292         };
3293         self.def_map.insert(id, path_resolution);
3294         if !self.is_accessible(vis) {
3295             let msg = format!("visibilities can only be restricted to ancestor modules");
3296             self.session.span_err(path.span, &msg);
3297         }
3298         vis
3299     }
3300
3301     fn is_accessible(&self, vis: ty::Visibility) -> bool {
3302         let current_module = self.get_nearest_normal_module_parent_or_self(self.current_module);
3303         let node_id = self.definitions.as_local_node_id(current_module.def_id().unwrap()).unwrap();
3304         vis.is_accessible_from(node_id, self)
3305     }
3306
3307     fn check_privacy(&mut self, name: Name, binding: &'a NameBinding<'a>, span: Span) {
3308         if !self.is_accessible(binding.vis) {
3309             self.privacy_errors.push(PrivacyError(span, name, binding));
3310         }
3311     }
3312
3313     fn report_privacy_errors(&self) {
3314         if self.privacy_errors.len() == 0 { return }
3315         let mut reported_spans = HashSet::new();
3316         for &PrivacyError(span, name, binding) in &self.privacy_errors {
3317             if !reported_spans.insert(span) { continue }
3318             if binding.is_extern_crate() {
3319                 // Warn when using an inaccessible extern crate.
3320                 let node_id = binding.module().unwrap().extern_crate_id.unwrap();
3321                 let msg = format!("extern crate `{}` is private", name);
3322                 self.session.add_lint(lint::builtin::INACCESSIBLE_EXTERN_CRATE, node_id, span, msg);
3323             } else {
3324                 let def = binding.def().unwrap();
3325                 self.session.span_err(span, &format!("{} `{}` is private", def.kind_name(), name));
3326             }
3327         }
3328     }
3329
3330     fn report_conflict(&self,
3331                        parent: Module,
3332                        name: Name,
3333                        ns: Namespace,
3334                        binding: &NameBinding,
3335                        old_binding: &NameBinding) {
3336         // Error on the second of two conflicting names
3337         if old_binding.span.lo > binding.span.lo {
3338             return self.report_conflict(parent, name, ns, old_binding, binding);
3339         }
3340
3341         let container = match parent.def {
3342             Some(Def::Mod(_)) => "module",
3343             Some(Def::Trait(_)) => "trait",
3344             None => "block",
3345             _ => "enum",
3346         };
3347
3348         let (participle, noun) = match old_binding.is_import() || old_binding.is_extern_crate() {
3349             true => ("imported", "import"),
3350             false => ("defined", "definition"),
3351         };
3352
3353         let span = binding.span;
3354         let msg = {
3355             let kind = match (ns, old_binding.module()) {
3356                 (ValueNS, _) => "a value",
3357                 (TypeNS, Some(module)) if module.extern_crate_id.is_some() => "an extern crate",
3358                 (TypeNS, Some(module)) if module.is_normal() => "a module",
3359                 (TypeNS, Some(module)) if module.is_trait() => "a trait",
3360                 (TypeNS, _) => "a type",
3361             };
3362             format!("{} named `{}` has already been {} in this {}",
3363                     kind, name, participle, container)
3364         };
3365
3366         let mut err = match (old_binding.is_extern_crate(), binding.is_extern_crate()) {
3367             (true, true) => struct_span_err!(self.session, span, E0259, "{}", msg),
3368             (true, _) | (_, true) if binding.is_import() || old_binding.is_import() => {
3369                 let mut e = struct_span_err!(self.session, span, E0254, "{}", msg);
3370                 e.span_label(span, &"already imported");
3371                 e
3372             },
3373             (true, _) | (_, true) => struct_span_err!(self.session, span, E0260, "{}", msg),
3374             _ => match (old_binding.is_import(), binding.is_import()) {
3375                 (false, false) => struct_span_err!(self.session, span, E0428, "{}", msg),
3376                 (true, true) => {
3377                     let mut e = struct_span_err!(self.session, span, E0252, "{}", msg);
3378                     e.span_label(span, &format!("already imported"));
3379                     e
3380                 },
3381                 _ => {
3382                     let mut e = struct_span_err!(self.session, span, E0255, "{}", msg);
3383                     e.span_label(span, &format!("`{}` was already imported", name));
3384                     e
3385                 }
3386             },
3387         };
3388
3389         if old_binding.span != syntax_pos::DUMMY_SP {
3390             err.span_label(old_binding.span, &format!("previous {} of `{}` here", noun, name));
3391         }
3392         err.emit();
3393     }
3394 }
3395
3396 fn names_to_string(names: &[Name]) -> String {
3397     let mut first = true;
3398     let mut result = String::new();
3399     for name in names {
3400         if first {
3401             first = false
3402         } else {
3403             result.push_str("::")
3404         }
3405         result.push_str(&name.as_str());
3406     }
3407     result
3408 }
3409
3410 fn path_names_to_string(path: &Path, depth: usize) -> String {
3411     let names: Vec<ast::Name> = path.segments[..path.segments.len() - depth]
3412                                     .iter()
3413                                     .map(|seg| seg.identifier.name)
3414                                     .collect();
3415     names_to_string(&names[..])
3416 }
3417
3418 /// When an entity with a given name is not available in scope, we search for
3419 /// entities with that name in all crates. This method allows outputting the
3420 /// results of this search in a programmer-friendly way
3421 fn show_candidates(session: &mut DiagnosticBuilder,
3422                    candidates: &SuggestedCandidates) {
3423
3424     let paths = &candidates.candidates;
3425
3426     if paths.len() > 0 {
3427         // don't show more than MAX_CANDIDATES results, so
3428         // we're consistent with the trait suggestions
3429         const MAX_CANDIDATES: usize = 5;
3430
3431         // we want consistent results across executions, but candidates are produced
3432         // by iterating through a hash map, so make sure they are ordered:
3433         let mut path_strings: Vec<_> = paths.into_iter()
3434                                             .map(|p| path_names_to_string(&p, 0))
3435                                             .collect();
3436         path_strings.sort();
3437
3438         // behave differently based on how many candidates we have:
3439         if !paths.is_empty() {
3440             if paths.len() == 1 {
3441                 session.help(
3442                     &format!("you can import it into scope: `use {};`.",
3443                         &path_strings[0]),
3444                 );
3445             } else {
3446                 session.help("you can import several candidates \
3447                     into scope (`use ...;`):");
3448                 let count = path_strings.len() as isize - MAX_CANDIDATES as isize + 1;
3449
3450                 for (idx, path_string) in path_strings.iter().enumerate() {
3451                     if idx == MAX_CANDIDATES - 1 && count > 1 {
3452                         session.help(
3453                             &format!("  and {} other candidates", count).to_string(),
3454                         );
3455                         break;
3456                     } else {
3457                         session.help(
3458                             &format!("  `{}`", path_string).to_string(),
3459                         );
3460                     }
3461                 }
3462             }
3463         }
3464     } else {
3465         // nothing found:
3466         session.help(
3467             &format!("no candidates by the name of `{}` found in your \
3468             project; maybe you misspelled the name or forgot to import \
3469             an external crate?", candidates.name.to_string()),
3470         );
3471     };
3472 }
3473
3474 /// A somewhat inefficient routine to obtain the name of a module.
3475 fn module_to_string(module: Module) -> String {
3476     let mut names = Vec::new();
3477
3478     fn collect_mod(names: &mut Vec<ast::Name>, module: Module) {
3479         match module.parent_link {
3480             NoParentLink => {}
3481             ModuleParentLink(ref module, name) => {
3482                 names.push(name);
3483                 collect_mod(names, module);
3484             }
3485             BlockParentLink(ref module, _) => {
3486                 // danger, shouldn't be ident?
3487                 names.push(token::intern("<opaque>"));
3488                 collect_mod(names, module);
3489             }
3490         }
3491     }
3492     collect_mod(&mut names, module);
3493
3494     if names.is_empty() {
3495         return "???".to_string();
3496     }
3497     names_to_string(&names.into_iter().rev().collect::<Vec<ast::Name>>())
3498 }
3499
3500 fn err_path_resolution() -> PathResolution {
3501     PathResolution::new(Def::Err)
3502 }
3503
3504 #[derive(PartialEq,Copy, Clone)]
3505 pub enum MakeGlobMap {
3506     Yes,
3507     No,
3508 }
3509
3510 __build_diagnostic_array! { librustc_resolve, DIAGNOSTICS }